WPF MVVM INotifyPropertyChanged Implementation - Model или ViewModel

Я прочитал несколько дискуссий о том, где реализовать 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 в Модель?

Спасибо.

29
задан IUnknown 13 March 2011 в 01:45
поделиться