Набор полей MVVM и упомянутое событие в реализующих классах INotifyPropertyChanged - PullRequest
2 голосов
/ 03 марта 2020

Если у нас есть свойство, которое зависит от другого свойства (изменение первого обновления обновлений второго), у нас есть два способа сделать это. Мы можем заставить Dependent получить только и позвонить RaiseOnPropertyChanged(nameof(Dependent)). Или мы можем сделать Dependent с полем поддержки и вместо этого просто присвоить это значение зависимому свойству DependentProperty = newValue. Какой путь более MVVM?

class Approach1 : INotifyPropertyChanged {
    private object _primary;
    public object Primary { 
       get { return _primary; }
       set { 
           if(_primary != value) { 
             _primary = value; 
             RaiseOnPropertyChanged(nameof(Dependent));
           }
     }

     public object Dependent {
         get { return computeValue(); }
     }

     private object computeValue() { ... } 
}

Второй подход:

class Approach2 : INotifyPropertyChanged {
    private object _primary;
    public object Primary { 
       get { return _primary; }
       set { 
           if(_primary != value) { 
             _primary = value; 
             RaiseOnPropertyChanged();
             Dependent = computeValue();
           }
     }

     private object _dependent;
     public object Dependent {
         get { return _dependent; }
         private set { if(_dependent != value) {
            Dependent = value;
            RaiseOnPropertyChanged();
         }

     }

     private object computeValue() { ... } 
}

1 Ответ

0 голосов
/ 08 марта 2020

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

Подход 1 имеет недостаток, когда вы не можете инкапсулировать вычисление свойства внутри этого свойства, но во всех свойствах, которые ему присвоены - но я думаю, что это незначительно недостаток, так как вы можете заключить его в функцию и вызвать эту функцию.

...