Индикатор MVVM. Правильный способ выполнения метода при действительном изменении значения свойства

#wpf #properties #mvvm-light

#wpf #свойства #mvvm-light

Вопрос:

Этот код позволяет выполнять метод, когда свойство установлено. Он выполняется столько раз, сколько установлено свойство. Я хотел бы знать вариант, когда метод выполняется только в случае, когда значение свойства действительно изменяется.

 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

        }

  

Ответ №1:

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

Ответ №2:

Если я правильно понимаю, что вы подразумеваете под «действительно измененным», вы можете окружить свой вызов DoSomehting следующим образом :

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

Более подробную информацию о value ключевом слове можно найти здесь

Ответ №3:

Вы могли бы просто сравнить значение с инициатором до его установки.

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

Возможно, передача значения в doSomething, если ему требуется новое значение для свойства.

Приведенный выше код дает понять, какое сравнение выполняется перед запуском dosomething. Если вы регулярно не вызываете методы из каждого или большинства установщиков, я бы не стал так сильно стремиться изменить стандартную сигнатуру метода для исключительных обстоятельств.

Комментарии:

1. возможно ли выполнить метод, когда свойство имеет значение true? Как это будет выглядеть?

2. Просто подставьте значение == true в if