Я прочитал несколько дискуссий о том, где реализовать INotifyPropertyChanged здесь, в StackOverflow и других блогах, но, похоже, есть случаи, когда вам нужно реализовать его в Модели. Вот мой сценарий - я ищу отзывы о моем заключении или мой подход неверен.
Я использую эту реализацию ObservableDictionary ( ObservableDictionary ), потому что мне нужны эффективные запросы с использованием ключа.
] В этот словарь я помещаю коллекцию объектов модели.
В моей виртуальной машине я объявляю экземпляр (книги) словаря и в XAML привязываю к нему.
Если я реализую INotifyPropertyChanged на виртуальной машине для книг и изменить значение имени книги в коде, пользовательский интерфейс не обновляется.
Если я реализую INotifyPropertyChanged на виртуальной машине для магазина и изменю значение имени книги в коде, пользовательский интерфейс не обновляется.
Если я реализую INotifyProperyChanged в модели и изменяю значение имени книги в коде, пользовательский интерфейс обновляется.
Событие Changed не запускается в первом случае, поскольку средство установки словаря не называется Item (a Book).
Я что-то упускаю, потому что, если это правильная интерпретация, если мне нужны согласованные уведомления для моих моделей, независимо от того, связаны ли они напрямую с XAML или через какую-то коллекцию, Я всегда хотел бы, чтобы Модель реализовывала INotifyProperyChanged.
Между прочим, помимо ссылки на dll, я лично не вижу INotifyPropertyChanged как функцию пользовательского интерфейса - думаю, ее следует определять в более общем пространстве имен .net - мои 2 цента.
РЕДАКТИРОВАНИЕ НАЧИНАЕТСЯ ЗДЕСЬ: Обычно это не так - просто для простого примера
public partial class MainWindow : Window
{
private BookViewModel vm;
public MainWindow() {
InitializeComponent();
vm = new BookViewModel();
this.DataContext = vm;
}
private void Button_Click(object sender, RoutedEventArgs e) {
vm.MakeChange();
}
}
XAML
Как указано выше, когда я нажимаю кнопку и меняю значение в первой книге, пользовательский интерфейс не изменяется.
Однако, когда я перемещаю INotifyPropertyChanged в модель, он работает нормально (обновления пользовательского интерфейса), потому что изменение находится в установщике свойств модели, а не в книгах в виртуальной машине:
public class Book : INotifyPropertyChanged
{
private string title;
public string Title {
get { return title; }
set {
if (value != title) {
title = value;
NotifyPropertyChanged("Title");
}
}
}
public List Authors { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info) {
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
Итак, возвращаясь к моему исходному вопросу, как мне сделать это без реализации INotifyPropertyChanged в Модель?
Спасибо.