【问题标题】:MVVM light. A proper way to execute a method when property's value is really changedMVVM 灯。当属性的值真正改变时执行方法的正确方法
【发布时间】:2021-01-21 08:30:44
【问题描述】:

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

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

        }

【问题讨论】:

    标签: wpf properties mvvm-light


    【解决方案1】:

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

            set
            {
                if(!Equals(value, _myProperty))
                {
                    DoSomething();
                }
                Set(MyPropertyPropertyName, ref _myProperty, value);
            }
    

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

    上面的代码清楚地说明了在运行 dosomething 之前要进行的比较。 除非您经常从每个或大多数 setter 中调用方法,否则我不会那么热衷于在特殊情况下更改标准方法签名。

    【讨论】:

    • 属性为真时是否可以执行方法?这会是什么样子?
    • 只在 if 中替换 value == true
    【解决方案2】:

    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;
    }
    

    【讨论】:

      【解决方案3】:

      如果我正确理解您所说的“真正改变”是什么意思,您可以像这样将您的电话转至DoSomehting

      if (value != _myProperty)
      {
           DoSomething();
      }
      

      更多关于value关键字的信息可以在here找到

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-10
        • 2012-09-02
        • 2013-07-26
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        • 2020-02-27
        • 2012-11-09
        相关资源
        最近更新 更多