仅在依赖属性更改值后才引发事件

时间:2010-11-11 22:02:27

标签: c# wpf data-binding inotifypropertychanged

我遇到这种情况,我有几个相互关联的控件。我对所述控件的Current / SelectedValue使用双向绑定,这样当用户更改值时,更改将反映在我的viewmodel的属性中。问题是,在绑定触发更改属性的setter处的更改后,我需要更改其他控件,基于第一个,更新UI,然后仅使用所有受影响属性的新值发送一个事件。我想在这方面做一些事情(类似于IEditableObject的东西):

public string PropA
{
    get{(...)}
    set
    {
        BeginEdit("PropA");
        PropA = value;
        PropB = SomeValueDependentOnA;
        PropC = SomeValueDependentOnA; 
        OnPropertyChanged("PropA");
        EndEdit("PropA");               //this is propA so send the event         
}

 public string PropB
{
    get{(...)}
    set
    {
        BeginEdit("PropB");
        PropB = value;
        PropA = SomeValueDependentOnB;
        PropC = SomeValueDependentOnB; 
        OnPropertyChanged("PropB");
        EndEdit("PropB");         
}

(...)

begin / endit方法不会做太多,只需检查启动操作的prop是否与调用endit相同,因此将忽略进一步的beginedits。 EndEdit我们将确保只有在PropA的setter中我们才能确定所有属性都已更改,我们可以发送事件,即事务类型。

虽然我认为这会起作用,但我认为这对于setter来说太过分了,而start / endit对于这个简单的事情来说似乎有些过分。

使用双向绑定可能不是这种情况的最佳选择,我应该从代码中的方法而不是属性设置器进行更新。

关于如何以其他方式这样做的任何消息?

2 个答案:

答案 0 :(得分:1)

恕我直言,大多数'犹太教'的方法是使用DependecyProperties在其强制处理程序中包含冲突代码,就像UI组件一样。

另一种方法是在VM字段上应用逻辑,而不是属性,然后触发UpdateTarget()绑定。

答案 1 :(得分:0)

我见过的标准方法是:

set 
{
    if (PropA != value)
    {
        PropA = value;
        OnPropertyChanged("PropA");
    }
}

这样,您只会在值更改时触发敲击更改,后续调用(由相关值触发)不会触发更多更改。