【问题标题】:How to make binding to dictionary item with change notification?如何通过更改通知绑定到字典项?
【发布时间】:2012-02-22 10:23: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”。但是当它的值改变时如何让它更新呢?

【问题讨论】:

    标签: c# .net wpf xaml data-binding


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      让你的字典成为一个字典(字符串,DescriptionObject),其中 DescriptionObject 有一个通知字符串属性,实现 PropertyChanged 并有一个 ToString 覆盖。
      然后将 (foo, fooDescription) 添加到字典中。如果您在 ButtonClick 处理程序中更改 fooDescription,则 TextBlock 也会更改。

      【讨论】:

        【解决方案3】:

        您需要像这样将索引器添加到您的代码中:

        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>
        

        【讨论】:

          猜你喜欢
          • 2010-12-09
          • 2020-03-07
          • 1970-01-01
          • 2019-04-11
          • 1970-01-01
          • 2010-11-23
          • 1970-01-01
          • 1970-01-01
          • 2021-12-18
          相关资源
          最近更新 更多