如何辨别模型是否已被用户或代码更改

时间:2011-05-13 06:49:29

标签: wpf data-binding inotifypropertychanged

我的模型实现INotifyPropertyChanged,并且我有一个WPF窗口绑定它(双向绑定)。

我需要知道何时通过绑定UI更改模型,因此我可以从另一个模块调用Update方法(然后将模型复制到其内部结构中)。 模型也可以由另一个模块更改。

如何判断(在我的PropertyChanged事件处理程序中)更改是否源自我的UI,而不是源于其他模块?

如果是触发PropertyChanged事件的其他模块,我不想调用Update方法。

2 个答案:

答案 0 :(得分:2)

我自己是WPF的新手,但我能想到的唯一明显的方法就是为模型添加额外的set方法,修改后备存储而不直接更改属性,从而触发PropertyChanged事件。要删除重复,属性设置器也应该调用这些方法,并且应该有一个boolean参数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);
    // ...
}

这不是一个我所知道的优雅方法,我希望其他人可以想到更聪明的东西,但我想不出一个从属性设置器内部找出究竟是什么设置该属性的好方法。

希望这至少是一个解决方法的建议。

答案 1 :(得分:0)

还有另一种方法:使用Binding.SourceUpdated

窗口上的每个绑定都必须设置为NotifyOnSourceUpdated=true,并且SourceUpdated事件的公共处理程序将执行其余操作(引发将在另一个模块上触发更新的Window.ModelEdited事件。)