WPF框架如何处理MVVM中属性的循环更新?
假设属性Name在视图中绑定到TextBox,就像这样。
private string name public string Name { get {return name;} set { name=value; OnPropertyChanged("Name"); } }
视图
当我们更新文本框中的文本时,它将调用Name属性中的setter,后者又会引发PropertyChanged,它假设再次更新UI。 我很好奇WPF如何避免更新的递归和引发事件。 是通过考虑该事件的发件人来完成的吗?
属性的标准实现应如下所示:
private string name; public string Name { get { return name; } set { if( name != value ) { name = value; OnPropertyChanged("Name"); } } }
请注意附加if
确保仅在属性的值实际更改时引发事件。
据我所知,没有递归。
1)TextBox使用viewmodel属性更新值。
2)Viewmodel引发更新,让UI知道某些内容发生了变化
3)TextBox现在更新自己以匹配viewmodel值。
也许这里的答案会帮助你。
如果你将一个属性从ui设置为viewmodel就是这样的。
- 塞特的电话开始了
- 价值集
- INotifyPropertyChanged开始了
- 完成INotifyPropertyChanged
- 塞特完成了
- getter叫做并完成了
- IDataErrorInfo调用并完成
但是如果你在viewmodel中设置了属性,它会像这样
- 塞特的电话开始了
- 价值集
- INotifyPropertyChanged开始了
- getter叫做并完成了
- IDataErrorInfo调用并完成
- 完成INotifyPropertyChanged
- 塞特完成了
将属性从UI更改为ViewModel可能会导致死锁类型的情况,这种情况可能会在两种情况下以较少的递归调用结束。 为了阻止这种情况发生,当WPF对模型进行更改时,它将继续通过INotifyPropertyChanged跟踪更改,但此更改将在调度程序队列中排队,并且将在其当前更新完成后执行。
由于视图模型的更改不是由WPF启动的,因此WPF不会对操作进行排队,它会立即执行更改。