为什么WPF绑定以两种不同的方式处理INotifyPropertyChanged?

10

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

让我们来看一个普通的启用验证的双向绑定。

如果您从UI设置属性到ViewModel,则会按照以下方式进行:

  • setter调用开始
  • 值设置
  • INotifyPropertyChanged开始
  • INotifyPropertyChanged完成
  • setter完成
  • getter调用和完成
  • IDataErrorInfo调用和完成

但是,如果您在ViewModel中设置属性,则会按照以下方式进行:

  • setter调用开始
  • 值设置
  • INotifyPropertyChanged开始
  • getter调用和完成
  • IDataErrorInfo调用和完成
  • INotifyPropertyChanged完成
  • setter完成
1个回答

11
改变从UI到ViewModel的属性可能导致死锁,而双向情况下可能会进入无限递归调用。为了防止这种情况发生,在WPF进行模型更改时,它将继续通过INotifyPropertyChanged跟踪更改,但此更改将排队在分派程序队列中,并且在当前更新完成后执行。
由于ViewModel中的更改不是由WPF启动的,因此WPF不会将操作排队,而是立即执行更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接