[英]Modifying property in codebehind doesn't update DataContext binding in ItemsTemplate of ListBox
我做了一個測試項目來證明我的問題。
在主窗口中,我定義了一個ListBox
和它的ItemTemplate
,以及 1 個按鈕Update 。
在DataTemplate
中,我定義了一個CheckBox
,其中IsChecked
綁定到IsUsed
屬性。
<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;
}
}
}
更新按鈕反轉所選項目的布爾屬性IsUsed
。
執行程序顯示第一項的復選框被選中,這是應該的。
但是,單擊Update並不會取消選中該復選框,即使它應該取消選中該復選框,因為它將IsUsed
屬性設置為false
。
我想我需要修改綁定來解決問題。
這個問題並不特定於布爾值,我用其他類型進行了測試。
當更改后面的任何屬性時,您需要通知 UI 這個更改以便綁定知道。
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 綁定更改為雙向 :)
<CheckBox IsChecked="{Binding IsUsed, Mode=TwoWay}"/>
對不起我的英語:/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.