Кооптирование Binding для прослушивания событий PropertyChanged без FrameworkElement - PullRequest
2 голосов
/ 25 октября 2011

У меня есть несколько вложенных моделей представления, которые реализуют INotifyPropertyChanged.Я хотел бы привязать прослушиватель событий к пути вложенных свойств (например, "Parent.Child.Name"), так же, как FrameworkElement свойства зависимостей могут быть связаны с произвольными вложенными свойствами.

Однако я просто хочу что-то вродеPropertyChanged слушатель событий - у меня нет элемента пользовательского интерфейса, который я бы хотел связать.Есть ли способ использовать существующую инфраструктуру для настройки такого источника событий?В идеале мне не нужно изменять классы модели представления (поскольку это не требуется для регулярного связывания данных в Silverlight).

1 Ответ

2 голосов
/ 25 октября 2011

Вы, безусловно, можете выбрать инфраструктуру привязки / свойства зависимостей для прослушивания изменений во вложенном свойстве.Код ниже - WPF, но я думаю, что вы можете сделать нечто подобное в Silverlight:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        this.DataContext = new Parent { Child = new Child { Name = "Bob" } };
        this.SetBinding(ChildNameProperty, new Binding("Child.Name"));
    }

    public string ChildName
    {
        get { return (string)GetValue(ChildNameProperty); }
        set { SetValue(ChildNameProperty, value); }
    }

    // Using a DependencyProperty as the backing store for ChildName.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ChildNameProperty =
        DependencyProperty.Register("ChildName", typeof(string), typeof(MainWindow), new UIPropertyMetadata(ChildNameChanged));

    static void ChildNameChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        MessageBox.Show("Child name is now " + e.NewValue);
    }
}

Так что я определил свой собственный DependencyProperty, а не часть какого-либо пользовательского интерфейса как такового (только класс MainWindow)) и привязать к нему «Child.Name» напрямую.Затем я смогу получать уведомления, когда Child.Name меняется.

Будет ли это работать для вас?

...