2016-10-08 1 views
2

При реализации INotifyPropertyChanged, должен ли PropertyChanged вызываться только тогда, когда n != value или он должен быть вызван, потому что был вызван набор?Должен ли я поднимать INotifyPropertyChanged, когда значение изменяется или когда установлено?

Я ищу здесь рекомендацию отраслевого стандарта (если такая вещь существует), для которой реализация лучше и почему.

Пример 1- иллюстрирует "немой" событие стратегии привлечения

class Person : INotifyPropertyChanged 
{ 
    private string name; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public string Name 
    { 
     get 
     { 
      return name; 
     } 

     set 
     { 
      name = value; 
      PropertyChanged(this, new PropertyChangedEventArgs(nameof(Name))); 
     } 
    } 
} 

Прецеденты с примером 1

Person p = new Person(); 

p.Name = "John"; // ProperyChanged fired 
p.Name = "John"; // ProperyChanged fired 

Пример 2- иллюстрирует " умная "стратегия повышения уровня жизни

class Person : INotifyPropertyChanged 
{ 
    private string name; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public string Name 
    { 
     get 
     { 
      return name; 
     } 

     set 
     { 
      if(name != value) 
      { 
       name = value; 
       PropertyChanged(this, new PropertyChangedEventArgs(nameof(Name))); 
      } 
     } 
    } 
} 

Прецеденты с примером 2

Person p = new Person(); 

p.Name = "John"; // ProperyChanged fired 
p.Name = "John"; // ProperyChanged ignored as name == value 

Уведомление if(name != value) в примере 2, который только позволит изменить значение, и ProperyChanged событие, когда входящее значение не совпадает существующее значение.

+0

Это отличная вещь в кодировании: вы можете заставить ее делать все, что вы хотите. –

+0

Я думаю, что это может быть один из ответов «зависит от». –

+0

Мне просто интересно, существует ли «рекомендуемый» подход между ними и почему? – series0ne

ответ

2

Как имя интерфейса предполагают, INotifyPropertyChanged, и в соответствии с MSDN:

Интерфейс INotifyPropertyChanged используется для уведомления клиентов, обычно связывающих клиентов, что значение свойства изменилось.

Было бы лучше всего запустить событие только по изменению.

https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

Типичная скороговоркой реализация будет что-то вроде:

public string Foo 
{ 
    get { return _foo; } 
    set 
    {  
     if (string.Equals(_foo, value)) return; 

     _foo= value; 
     OnPropertyChanged(); 
    } 
} 

Кстати, это тоже условность в ReSharper, как можно найти здесь; https://www.jetbrains.com/help/resharper/2016.1/Coding_Assistance__INotifyPropertyChanged_Support.html

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

пример: conider следующий код:

public string DependentFoo 
{ 
    get { return _foo; } 
    set 
    {  
     if (string.Equals(_foo, value)) return; 

     _foo= value; 

     //if some condition: 
     DependentBar = ""; 
     OnPropertyChanged(); 
    } 
} 

public string DependentBar 
{ 
    get { return _bar; } 
    set 
    {  
     if (string.Equals(_bar, value)) return; 

     _bar = value; 

     //if some condition: 
     DependentFoo = ""; 
     OnPropertyChanged(); 
    } 
} 

Хотя это не большой пример, я думаю, вы получите точку.

1

documentation of INotifyPropertyChanged говорит, что цель интерфейса

Уведомляет клиентов, что значение свойства изменилось.

Это явно относится к изменению «стоимости собственности». Примеры на странице документации также использовать шаблон, как в вашем примере 2.

-2

Нет никакого «правильного» способа сделать это. Все зависит от того, что вам нужно. Например:

Если вам нужно обновить GUI, то я бы сказал, что Calling PropertyChanged, когда свойство infact не изменено, не имеет значения. Однако, если вы хотите использовать мероприятие для других целей (например, протоколирование или что-то подобное), то это может быть наиболее определенно решением.

Смежные вопросы