10

我最近发现 wpf 以两种不同的方式处理 INotifyPropertyChanged。我只想知道是什么原因。

让我们采用验证为 true 的正常双向绑定。

如果您将属性从 ui 设置为 viewmodel,它会像这样。

  • 设置器调用开始
  • 值集
  • INotifyPropertyChanged 已启动
  • INotifyPropertyChanged 完成
  • 二传手完成
  • getter 调用并完成
  • IDataErrorInfo 调用并完成

但是如果您在视图模型中设置属性,它会像这样

  • 设置器调用开始
  • 值集
  • INotifyPropertyChanged 已启动
  • getter 调用并完成
  • IDataErrorInfo 调用并完成
  • INotifyPropertyChanged 完成
  • 二传手完成
4

1 回答 1

11

将属性从 UI 更改为 ViewModel 可能会导致死锁情况,这种情况可能会在两种情况下遇到结束较少的递归调用。为了阻止这种情况发生,当 WPF 对模型进行更改时,它会继续通过 INotifyPropertyChanged 跟踪更改,但此更改将在调度程序队列中排队,并在其当前更新完成后执行。

由于 viewmodel 中的更改不是由 WPF 发起的,因此 WPF 不会对操作进行排队,它会立即执行更改。

于 2012-06-08T10:50:50.777 回答