如果模型实现了INotifyPropertyChanged,ViewModel应该如何为PropertyChanged事件注册/注销?

时间:2013-05-02 14:39:46

标签: c# .net wpf mvvm inotifypropertychanged

我有一个实现INotifyPropertyChanged的模型,它可能会被后台业务线程更新。其相关的ViewModel也实现了INotifyPropertyChanged。他们的View显然与ViewModel绑定。此视图可能会显示在多个位置,我的目标是在模型更改时所有这些都会更新。

我知道ViewModel应该注册Model的PropertyChanged事件。但我不知道注册和取消注册的最佳位置何时何地。特别是关于取消注册,因为我害怕在模型上有数百个VM事件处理程序,用于VM /视图,不再显示。

提前致谢。

2 个答案:

答案 0 :(得分:4)

您是否绝对有必要限制View不直接绑定到模型?

您可以将模型公开为VM上的属性,然后让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(当MyViewModelDataContext时):

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

<强>更新

也许这对于以“弱”方式进入模型的PropertyChanged事件有所帮助

IWeakEventListener

  

使用WeakEventManager的中央事件调度,即使源对象的生命周期超出侦听器,也可以对侦听器的处理程序进行垃圾收集(或手动清除)。

用于

Josh Smith's PropertyObserver

这有望解决您需要明确取消注册的问题吗?

答案 1 :(得分:0)

我通过在加载时挂接模型事件并在卸载时删除它们来解决这个问题,这里的问题是如果视图模型离开屏幕,视图模型可能会错过事件。我通常只是在加载时快速刷新数据。

OnLoad - 从模型和挂钩事件中刷新VM数据。 OnUnLoad - 删除你已经放置的任何钩子。