Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 避免对PropertyChanged执行级联操作_C#_.net_Inotifypropertychanged - Fatal编程技术网

C# 避免对PropertyChanged执行级联操作

C# 避免对PropertyChanged执行级联操作,c#,.net,inotifypropertychanged,C#,.net,Inotifypropertychanged,假设我有这个模型: public sealed class Model : ModelBase // base is a INotifyPropertyChanged implementation { private void SomeAction() { Console.WriteLine("SomeAction!"); } protected override void OnPropertyChanged(string pro

假设我有这个模型:

public sealed class Model : ModelBase // base is a INotifyPropertyChanged implementation
{        
    private void SomeAction()
    {
        Console.WriteLine("SomeAction!");
    }

    protected override void OnPropertyChanged(string propertyName)
    {
        base.OnPropertyChanged(propertyName);

        switch (propertyName)
        {
            case "A":
                B = A + 1;
                SomeAction();
                break;
            case "B":
                SomeAction();
                break;
        }
    }

    public int A
    {
        get { return a; }
        set
        {
            if (a != value)
            {
                a = value;
                OnPropertyChanged("A");
            }
        }
    }
    private int a;

    public int B
    {
        get { return b; }
        set
        {
            if (b != value)
            {
                b = value;
                OnPropertyChanged("B");
            }
        }
    }
    private int b;      
}
这里有两个属性:
A
B
<代码>B取决于
A
-当
A
的值更改时,
B
也必须更改。无论如何,当这些属性中的任何一个发生更改时,都应该执行
SomeAction

显然,当
A
发生更改时,我希望避免两次调用
SomeAction

有什么优雅的方法可以做到这一点(某种布尔标志不是优雅的方法)

UPD


也许,我应该提到,我正在寻找比下面答案中提供的更通用的解决方案。原因是当属性的数量增加时,代码复杂度增加得更快。例如,这些图-
D
您可以在每个属性设置器中调用
SomeAction

public int A
{
    get { return a; }
    set
    {
        if (a != value)
        {
            a = value;
            b = value + 1;
            OnPropertyChanged("A");
            OnPropertyChanged("B");
            SomeAction();
        }
    }
}
private int a;

public int B
{
    get { return b; }
    set
    {
        if (b != value)
        {
            b = value;
            OnPropertyChanged("B");
            SomeAction();
        }
    }
}
private int b;      

对于是否将多个属性更改视为单个操作,您的标准似乎是:“它是否在
OnPropertyChanged
方法中处理?”但也是此方法首先单独负责调用该操作,因此。。。为什么不直接设计
OnPropertyChanged
来避免级联呢?它应该非常简单,只需删除其中一个调用:

case "A":
    B = A + 1;
    break;
case "B":
    SomeAction();
    break;

我不认为这是不雅的,因为所有的逻辑都局限于一个方法。这里基本上有一个递归方法,其中“B”是终止条件。

-1这是错误的。您已更改
b
的值,并且未触发
PropertyChanged
事件。任何有界属性都不会更新。由于属性setter
B=value+1,这仍将调用
SomeAction
两次@SriramSakthivel是的,我刚刚注意到并做了一个回滚。这看起来不错+1@Henrik:谢谢你的回答。问题在于,您的代码避免了重复调用
SomeAction
,但它通常无法解决任务。如果有3个或4个属性,或者依赖关系图稍微复杂一点,您会怎么做?
case "A":
    B = A + 1;
    break;
case "B":
    SomeAction();
    break;