MVVM 灯。当属性的值真正更改时执行方法的正确方法



此代码允许在设置属性时执行该方法。它执行的次数与属性设置的次数一样多。我想知道一个变体,当方法只在属性值真正更改的情况下执行时。

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的方法,否则我不会那么热衷于在特殊情况下更改标准方法签名。

最新更新