7

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

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

提前致谢。

4

2 回答 2

4

限制视图不直接绑定到模型是绝对必要的吗?

您可以将模型公开为 VM 上的属性,然后让您的视图直接绑定到它,从而不让 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

使用 Wea​​kEventManager 的中央事件分派可以使侦听器的处理程序被垃圾收集(或手动清除),即使源对象的生命周期超出侦听器也是如此。

用于

乔什·史密斯的 PropertyObserver

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

于 2013-05-02T14:51:10.907 回答
0

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

OnLoad - 从模型和挂钩事件中刷新 VM 数据。OnUnLoad - 移除您放置的所有挂钩。

于 2013-05-02T15:45:13.547 回答