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不会对操作进行排队,它会立即执行更改。