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