2013-05-02 1 views
7

У меня есть модель, которая реализует INotifyPropertyChanged и может быть обновлена ​​фоновой деловой нитью. Связанный с ним ViewModel также реализует INotifyPropertyChanged. И их вид явно привязывается к ViewModel. Этот вид может отображаться во многих местах, и моя цель состоит в том, чтобы все они обновлялись при изменении модели.Если модель реализует INotifyPropertyChanged, как должен ViewModel регистрировать/отменять регистрацию для события PropertyChanged?

Я знаю, что ViewModel должен зарегистрироваться для события PropertyChanged модели. Но я не знаю, когда и где лучшее место для регистрации и отмены регистрации. Специально об отмене регистрации, так как я боюсь иметь сотни обработчиков событий VM на модели для виртуальных машин/представлений, которые больше не отображаются.

Заранее благодарен.

ответ

4

Вам абсолютно необходимо ограничить представление, не связанное напрямую с моделью?

Вы можете выставить модель как свойство на виртуальной машине, а затем ваш View непосредственно связываться с ним, таким образом, не имея VM подписаться на INPC от модели

что-то вроде:

public class MyViewModel: INotifyPropertyChanged { 
... 

private MyModel _model; 
public MyModel Model { 
    get { 
    return _model; 
    } 
    set { 
    if (value == _model) 
     return; 
    value = _model; 
    RaisePropertyChanged(() => Model); 
    } 
} 
... 

} 

и в XAML (когда MyViewModel является DataContext): Обновление

<TextBlock Text="{Binding Model.ModelProperty}" /> 

:

Может быть, это какая-то помощи для нарезания в PropertyChanged событий Моделей в «слабых» модах

IWeakEventListener

Использования центрального события диспетчеризации из WeakEventManager позволяет обработчикам для слушателей быть сбор мусора (или ручная очистка), даже если срок жизни исходного объекта выходит за пределы слушателей.

, который используется в

Josh Smith's PropertyObserver

Это следует надеяться, решить вопрос о необходимости явно отменить регистрацию?

+0

Спасибо за ваш ответ. Думаю, это необходимо. Поскольку я должен манипулировать данными Модели, чтобы быть связанными легко и чисто. – n0ne

+0

управляют данными Модели, где? в ВМ? это тоже не очень хорошая практика. Вы должны манипулировать данными Модели в Модели, если это так, или если это манипуляция только для рендеринга View, она должна быть в конвертере. – Viv

+0

Да, я имел в виду некоторый взгляд на визуализацию. Отрисовка довольно сложна, и это не просто одно свойство сопоставления свойств, которое я могу использовать в конвертере. – n0ne

0

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

OnLoad - обновляет данные виртуальной машины от модели и вызывает события. OnUnLoad - удалите все крючки, которые вы положили на место.

+0

Хорошая идея! Но что, если элемент находится на экране в режиме Unload? VM пропустит его, и крючки событий останутся там навсегда ... – n0ne

+0

Событие разгрузки, скорее всего, будет срабатывать по мере того, как элемент отключается от экрана, но даже если он остается загруженным, в какой-то момент он будет вызываться разгрузкой, когда его больше нет обязательный. – Andy

+0

@ Энди, если что-то подписывается на события вашего объекта (например, INPC), он никогда не получит сбор мусора. Почему бы просто не использовать WeakEvents? – BrainSlugs83

Смежные вопросы