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关键字的更多信息,请参见here

,

您可以在设置值之前将其与支持者进行比较。

function Joke(props) {
  let content = <div>None of the condition matched!</div>;

  if (props.question && props.punchline) {
    content = (
      <div>
        <h3>Question: {props.question}</h3>
        <h3>Answer: {props.punchline}</h3>
        <hr />
      </div>
    )
  } else if (props.punchline) {
    content = (
      <div>
        <h3>Answer: {props.punchline}</h3>
        <hr />
      </div>
    )
  }

  return content;
}

如果需要该属性的新值,则可能将值传递给DoSomething。

上面的代码使运行dosomething之前的比较清楚。 除非您定期从每个或大多数设置者那里调用方法,否则我不会非常热衷于在特殊情况下更改标准方法签名。