我的模型实现了INotifyPropertyChanged
,并且我绑定了一个WPF窗口(双向绑定)。
我需要知道何时通过绑定 UI 更改模型,以便我可以从另一个模块调用 Update 方法(然后将我的模型复制到其内部结构)。模型也可以由另一个模块更改。
如何判断(在我的PropertyChanged
事件处理程序中)更改是否源自我的 UI,而不是其他模块?
如果是触发PropertyChanged
事件的另一个模块,我不想调用 Update 方法。
我自己对 WPF 相当陌生,但我能想到的唯一明显的方法是向模型添加额外的 set 方法,这些方法在不直接更改属性的情况下修改后备存储,从而触发 PropertyChanged 事件。为了消除重复,属性设置器可能也应该调用这些方法,并且应该有一个布尔参数fireChangedEvent。像这样:
public string SomeThing
{
get { return _someThing; }
set { SetSomeThing(value, true); }
}
public void SetSomeThing(string value, bool fireChangedEvent)
{
_someThing = value;
if(fireChangedEvent)
{
NotifyPropertyChanged("SomeThing");
}
}
然后,在另一个模块中,它将是
public void DoStuff
{
// ...
model.SetSomeThing("foo",false);
// ...
}
我知道这不是一个优雅的方法,我希望其他人能想到更聪明的东西,但我想不出一个好方法可以从属性设置者内部找出该属性的确切设置。
希望这至少是一个解决方法建议。
还有另一种方法:使用 Binding.SourceUpdated
窗口上的每个绑定都必须NotifyOnSourceUpdated=true
设置,并且 SourceUpdated 事件的公共处理程序将完成其余的工作(引发将在另一个模块上触发更新的 Window.ModelEdited
事件)。