我最近发现wpf以两种不同的方式处理INotifyPropertyChanged . 我只是想知道是什么原因 .
让我们采用正常的双向绑定验证为真 .
如果你将一个属性从ui设置为viewmodel就像这样 .
-
setter调用已启动
-
值设置
-
INotifyPropertyChanged已启动
-
完成了INotifyPropertyChanged
-
setter完成了
-
getter调用并完成
-
IDataErrorInfo调用并完成
但如果你在viewmodel中设置了属性,它会像这样
-
setter调用已启动
-
值设置
-
INotifyPropertyChanged已启动
-
getter调用并完成
-
IDataErrorInfo调用并完成
-
完成了INotifyPropertyChanged
-
setter完成了
1 回答
将属性从UI更改为ViewModel可能会导致死锁类型的情况,这种情况可能会在两种方案中结束较少的递归调用 . 为了阻止这种情况发生,当WPF对模型进行更改时,它将继续通过INotifyPropertyChanged跟踪更改,但此更改将在调度程序队列中排队,并且将在其当前更新完成后执行 .
由于视图模型的更改不是由WPF启动的,因此WPF不会对操作进行排队,它会立即执行更改 .