此代码允许在设置属性时执行该方法。它执行的次数与属性设置的次数一样多。我想知道一个变体,当方法只在属性值真正更改的情况下执行时。
public const string MyPropertyPropertyName = "MyProperty";
private bool _myProperty = false;
public bool MyProperty
{
get
{
return _myProperty;
}
set
{
Set(MyPropertyPropertyName, ref _myProperty, value);
DoSomething();
}
}
private void DoSomething()
{
// DO YOUR WORK
}
Set
方法应返回一个bool
值,该值指示属性是否实际设置,然后:
set
{
if (Set(MyPropertyPropertyName, ref _myProperty, value))
DoSomething();
}
如果它没有返回值,您应该修改它,或者使用您自己的自定义Set
方法:
protected bool Set<T>(string propertyName, ref T storage, T value)
{
if (Equals(storage, value))
return false;
storage = value;
OnPropertyChanged(propertyName);
return true;
}
如果我能正确理解你所说的";真的变了";,你可以这样环绕你对DoSomehting
的呼叫:
if (value != _myProperty)
{
DoSomething();
}
关于value
关键字的更多信息可以在这里找到
您可以在设置之前将值与backer进行比较。
set
{
if(!Equals(value, _myProperty))
{
DoSomething();
}
Set(MyPropertyPropertyName, ref _myProperty, value);
}
如果DoSomething需要属性的新值,则可能会将值传递给它。
上面的代码清楚地表明了在运行dosomething之前要进行什么比较。除非你经常调用每个或大多数setter的方法,否则我不会那么热衷于在特殊情况下更改标准方法签名。