Как сделать привязку к элементу словаря с уведомлением об изменении? - PullRequest
0 голосов
/ 22 февраля 2012

Рассмотрим следующий 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". Но как заставить его обновляться при изменении его значения?

Ответы [ 3 ]

0 голосов
/ 22 февраля 2012

ваш словарь должен быть словарем (строки, DescriptionObject), где DescriptionObject имеет свойство уведомляющей строки, реализует PropertyChanged и имеет переопределение ToString.
Затем вы добавляете (foo, fooDescription) в свой словарь. Если вы измените fooDescription в своем обработчике ButtonClick, TextBlock тоже изменится.

0 голосов
/ 10 марта 2013

Вам нужно добавить индексатор к вашему коду следующим образом:

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>
0 голосов
/ 22 февраля 2012

Вам необходимо подать уведомление об изменении для индексатора, используя Binding.IndexerName в качестве имени свойства, вы можете инкапсулировать его в новый класс, наследующий или управляющий Dictionary.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...