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

n0n*_*0ne 7 .net c# wpf mvvm inotifypropertychanged

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

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

提前致谢.

Viv*_*Viv 4

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

您可以将模型公开为虚拟机上的属性,然后将视图直接绑定到它,从而无需虚拟机从模型订阅 INPC

就像是:

public class MyViewModel: INotifyPropertyChanged {
...

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

}
Run Code Online (Sandbox Code Playgroud)

并在 xaml 中(什么时候MyViewModel)DataContext:

<TextBlock Text="{Binding Model.ModelProperty}" />
Run Code Online (Sandbox Code Playgroud)

更新:

PropertyChanged也许这对于以“弱”方式挖掘模特的事件有一些帮助

IWeakEventListener

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

这是用在

约什·史密斯的《PropertyObserver》

这应该有望解决您需要显式取消注册的问题?