我有一个实现INotifyPropertyChanged
的模型,它可能会被后台业务线程更新。其相关的ViewModel也实现了INotifyPropertyChanged
。他们的View显然与ViewModel绑定。此视图可能会显示在多个位置,我的目标是在模型更改时所有这些都会更新。
我知道ViewModel应该注册Model的PropertyChanged
事件。但我不知道注册和取消注册的最佳位置何时何地。特别是关于取消注册,因为我害怕在模型上有数百个VM事件处理程序,用于VM /视图,不再显示。
提前致谢。
答案 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(当MyViewModel
是DataContext
时):
<TextBlock Text="{Binding Model.ModelProperty}" />
<强>更新强>
也许这对于以“弱”方式进入模型的PropertyChanged
事件有所帮助
使用WeakEventManager的中央事件调度,即使源对象的生命周期超出侦听器,也可以对侦听器的处理程序进行垃圾收集(或手动清除)。
用于
这有望解决您需要明确取消注册的问题吗?
答案 1 :(得分:0)
我通过在加载时挂接模型事件并在卸载时删除它们来解决这个问题,这里的问题是如果视图模型离开屏幕,视图模型可能会错过事件。我通常只是在加载时快速刷新数据。
OnLoad - 从模型和挂钩事件中刷新VM数据。 OnUnLoad - 删除你已经放置的任何钩子。