【问题标题】:Raise event only after dependent properties change value仅在依赖属性更改值后引发事件
【发布时间】:2010-11-11 22:02:26
【问题描述】:

我有这种情况,我有几个相互关联的控件。我对所述控件的 Current/SelectedValue 使用双向绑定,这样当用户更改值时,更改会反映在我的视图模型的属性中。问题是,在绑定触发更改属性的设置器处的更改后,我需要更改其他控件,基于第一个,更新 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 方法作用不大,只是检查启动操作的道具是否与调用 endedit 的道具相同,因此将忽略进一步的 beginedits。 EndEdit 我们将确保只有在 PropA 的设置器中才能确定所有属性都已更改,并且我们可以发送事件,一种事务。

虽然我认为这会奏效,但我认为这在二传手上做的太多了,而且对于这个简单的事情来说,开始/结束似乎有点过头了。

对于这种情况,也许使用 2-way 绑定不是最好的选择,我应该从后面代码中的方法而不是属性设置器进行更新。

关于如何以其他方式执行此操作的任何建议?

【问题讨论】:

    标签: c# wpf data-binding inotifypropertychanged


    【解决方案1】:

    恕我直言,这里最“洁净”的方法是使用 DependecyProperties 在其强制处理程序中包含冲突代码,就像 UI 组件一样。

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

    【讨论】:

    • 我将尝试使用 DependencyProperties。我不太了解您所说的另一种方式,请您说得更清楚一些(我得到了 UpdateTarget 部分的部分,但是我将如何/在哪里将逻辑应用于字段?)。第二个建议是我必须使用显式模式设置绑定,对吧?
    【解决方案2】:

    我见过的标准做法是:

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

    这样你只在值变化时触发knock on changes,后续调用(由依赖值触发)不会触发更多变化。

    【讨论】:

    • 您可以直接在 if 内或在 PropertyChanged 处理程序中更新其他人。
    • 我想在 PropertyChanged 处理程序内部进行更新,但问题是它会在属性设置器之间弹跳,并且最终操作事件将被触发多次(这是我试图避免的)。
    • 如果您只在值从旧值更改为不同值时触发事件,这将不是问题。
    • PropA 更改 -> 在 PropertyChanged 处理程序内我更改 PropB -> 我再次在 PropertyChanged 处理程序内;这次我将尝试更新 PropA 但正如你所说的值是相同的,所以我不会改变它,但是我必须改变 PropC 并且值不同等等。我怎么知道将操作事件发送到哪里,因为在 PropA 的 if 中我更改了 PropB,但如果我更改了 PropC,则在 PropB 中。这是我的疑问。
    • 您也可以更改 setter 中的依赖值(但是您应该在所有已更改的内容上引发属性更改)。
    猜你喜欢
    • 2011-01-29
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2014-06-14
    • 1970-01-01
    相关资源
    最近更新 更多