Как уведомить представление в MVVM, когда модель изменена, но свойства не изменены - PullRequest
0 голосов
/ 21 февраля 2012

Я привязал в своем списке представлений элементы к observableCollection в моей ViewModel (у меня есть два представления списка, каждое со своим собственным observableCollection). Я также ограничил несколько свойств строки состояния свойствами в ViewModel.

В моей модели представления у меня есть особый вид функций копирования / вставки, которые копируют «буферы памяти». На самом деле свойства в моей модели представления (и модели ниже) являются не чем иным, как «указателями» на эти буферы памяти. При копировании я знаю, что свойства изменяются, но сами значения не меняются с помощью установщика (поэтому INotifyPropertyChanged не вызывается).

Как я могу обновить представления списка? Строка состояния не так сложна, потому что я могу вызвать метод в модели представления для пересчета значений. Однако для данных представления списка это весьма непрактично.

В не MVVM я бы просто снова заполнил их данными, но это невозможно (я думаю) с MVVM / привязкой.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Итак, в вашей модели представления есть ObservableCollection элементов (скажем, ObservableCollection).Вам нужно убедиться, что MyItem (то есть каждый элемент в коллекции) происходит от INotifyPropertyChanged.Затем, когда вы изменяете элементы в коллекции, запускается событие PropertyChanged.WPF List View подберет его.

RaisePropertyChanged, описанный другими комментаторами, является служебным методом, обычно добавляемым в классы VM (часто в общий базовый класс всех классов VM).Это вызывает событие PropertyChanged:

protected void RaisePropertyChanged( string prop ) {
    if( PropertyChanged != null ) {
        PropertyChanged( this, new PropertyChangedEventArgs(prop) );
    }
}

Как описано другими комментаторами, нет ничего, что предписывало бы вам инициировать событие PropertyChanged только изнутри сеттера.В вашем методе Copy просто вызовите RaisePropertyChanged с соответствующими именами свойств (вы можете вызывать его несколько раз для каждого измененного свойства).

EDIT: для строки состояния, если вы хотите следовать MVVMшаблон проектирования, вы не должны вызывать методы из виртуальной машины в представление (это ключевое понятие в MVVM: ViewModel является независимым от представления).Вы должны просто вызвать метод RaisePropertyChanged для всех свойств, управляющих строками состояния.

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

Решение по комментариям:

Подайте правильное уведомление при копировании этих буферов памяти: Используйте

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