我做了一个测试项目来演示我的问题。
在主窗口中,我定义了一个ListBox
及其ItemTemplate
,以及一个按钮Update。
在DataTemplate
中,我定义了一个IsChecked
绑定到IsUsed
属性的CheckBox
。
<Window x:Class="Tests.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<WrapPanel>
<ListBox x:Name="listBox">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsUsed}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Content="Update" Click="ButtonUpdate_Click"/>
</WrapPanel>
</Window>
项目的业务对象:
namespace Tests;
public class Foo
{
public Foo(bool isUsed) => IsUsed = isUsed;
public bool IsUsed { get; set; }
public override string ToString() => IsUsed.ToString();
}
MainWindow的后台代码:
using System.Windows;
namespace Tests;
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
listBox.ItemsSource = new Foo[]
{
new(true),
new(false),
};
}
private void ButtonUpdate_Click(object sender, RoutedEventArgs e)
{
Foo? SelectedItem = (Foo)listBox.SelectedItem;
if (SelectedItem is not null)
{
SelectedItem.IsUsed = false;
}
}
}
Update按钮反转所选项的布尔属性IsUsed
。
执行程序显示第一个项目的复选框被选中,因为它应该是。
然而,点击Update不取消复选框,即使它应该,因为它设置IsUsed
属性为false
。
我想我需要修改绑定来解决这个问题。
这个问题不是布尔值所特有的,我用其他类型测试过。
当在后台更改任何属性时,您需要通知UI此更改为bind知道。
public class Foo : INotifyPropertyChanged
{
#region INotifyPropertyChanged implementos
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
private bool isUsed;
public Foo(bool isUsed) => IsUsed = isUsed;
public bool IsUsed { get => isUsed; set { isUsed = value; RaisePropertyChanged(); } }
public override string ToString() => IsUsed.ToString();
}
和更改复选框绑定到双向如果你需要更改UI:)
<CheckBox IsChecked="{Binding IsUsed, Mode=TwoWay}"/>
sorry about my English:/