2010-10-05 3 views
1

Я видел приложения, реализующие этот интерфейс повсюду. Во многих случаях мы могли бы использовать новый синтаксис свойств, напримерКогда мне нужно реализовать INotifyPropertyChanged?

public int Foo { get; set; } 

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

Может ли кто-нибудь объяснить, когда этот интерфейс действительно необходим?

ответ

1

Это необходимо, если вы хотите подписаться на уведомления о том, что свойство изменилось. Если вам не нужно (и нет необходимости в сторонних библиотеках), вам не нужно реализовывать этот интерфейс.

+0

это для уведомлений о привязке к свойствам свойств –

2

Вы реализуете этот интерфейс, когда ваш объект данных должен рекламировать (уведомлять) об изменении свойства. Это особенно важно при использовании привязки данных и очень полезно при использовании шаблона Observer.

Check here для подхода, который я придерживаюсь, когда у меня есть много свойств, которые необходимо уведомить об изменениях.

0

Этот интерфейс необходим при работе с библиотеками или другими функциями в рамках, которые ожидают его.

Наиболее распространенным является использование инфраструктуры пользовательского интерфейса, такой как WPF с привязкой данных. Чтобы пользовательский интерфейс «знал», что ваше свойство изменилось, он может отражать содержимое TextBox, например, объект, которому его граница должна быть либо DependencyObject, и свойство должно быть DependencyProperty, или вам нужно реализовать INotifyPropertyChanged.

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

Это, как говорится, обычно реализует это в базовом классе, что может сделать вашу реализацию подкласса только несколькими строками на каждое свойство. (Вы не можете использовать автоматические свойства, но вам может понадобиться только пара дополнительных строк в установщике, если вы используете базовый класс.)

0

Альтернативой является использование инфраструктуры ReactiveExtensions (Rx) Microsoft, чтобы обернуть все водопроводная работа в единый объект <T>.

См. this StackOverflow question and answers для примера того, как это сделать.

0

ли это как то

public class ViewModelBase : INotifyPropertyChanged 

{

protected void SetProperty<t>(ref T newValue, ref T currentValue, bool notify, string propertyName, params string[] additionalProperties) 
{ 
    bool changed = notify && ((newValue != null && !newValue.Equals(currentValue)) || (newValue == null && currentValue != null)); 
    currentValue = newValue; 
    if (changed) 
    { 
     OnPropertyChanged(propertyName); 

     if (additionalProperties != null) 
      foreach (string additionalProperty in additionalProperties) 
       OnPropertyChanged(additionalProperty); 
    } 
} 

protected virtual void OnPropertyChanged(string propertyName) 
{ 
    if (this.PropertyChanged != null) 
     this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
} 

public event PropertyChangedEventHandler PropertyChanged; 

}

public class MyRealViewModel : ViewModelBase 

{ общественные ИНТ NumberOfItems { ГЭТ {вернуться _numItems; } set {SetProperty (значение ref, ref_numItems, true, "NumberOfItems"); }}

public bool SomeKindOfFlag 
{ 
    get { return _flag; } 
    set { SetProperty(ref value, ref _flag, false, ""); } 
} 

public LightSabre WeaponOfChoice 
{ 
    get { return _weapon; } 
    set { SetProperty(ref value, ref _weapon, true, "WeaponOfChoice", "SomeKindOfFlag", "NumberOfItems"); } 
} 

private bool _flag; 
private int _numItems; 
private LightSabre _weapon; 

}

public class LightSabre 

{

общественная строка LightSabreName {получить; задавать; }

public override bool Equals(object obj) 
{ 
    if (obj != null && obj as LightSabre != null) 
     return ((LightSabre)obj).LightSabreName == this.LightSabreName; 

    return false; 
} 

}

Он извлекается из-за выше ответ, действительно помог мне.

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