修改代码隐藏中的属性不会更新列表框的项模板中的数据上下文绑定



我做了一个测试项目来演示我的问题。
在主窗口中,我定义了一个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:/