如何使用更改通知绑定到字典项

本文关键字:字典 绑定 通知 何使用 | 更新日期: 2023-09-27 18:25:19

考虑以下XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <TextBlock Text="{Binding Dic[foo]}" />
        <Button Content="test" Click="Button_Click" />
    </StackPanel>
</Window>

支持代码:

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public Dictionary<string, string> Dic { get; set; }
        public MainWindow()
        {
            InitializeComponent();
            Dic = new Dictionary<string, string>();
            Dic.Add("foo", "bar");
            DataContext = this;
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // Doesn't work :(
            Dic["foo"] = "YEAH!";
        }
    }
}

这里TextBlock正确地绑定到字典项"foo"。但是,当其值发生变化时,如何使其更新?

如何使用更改通知绑定到字典项

您需要使用Binding.IndexerName作为属性名称为索引器发出更改通知,您可能需要将其封装在继承或管理Dictionary的新类中。

让dictionary成为dictionary(字符串的,DescriptionObject)其中DescriptionObject具有通知字符串属性,实现PropertyChanged并具有ToString重写
然后将(foo,fooDescription)添加到dictionary中。如果您在ButtonClick处理程序中更改fooDescription,那么TextBlock也会更改。

您需要将索引器添加到代码中,如下所示:

private Dictionary<string, string> Dic { get; set; } 
public string this[string key]
{
    get { return Dic[key]; }
    set
    {
        if(key != null && Dic[key] != value)
            Dic[key] = value;
        OnPropertyChanged("Item[" + key + "]");
    }
}

然后,在xaml中,您绑定到索引器,当项目更改时,它将被通知:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <TextBlock Text="{Binding [foo]}" />
        <Button Content="test" Click="Button_Click" />
    </StackPanel>
</Window>