Когда мне нужно реализовать INotifyPropertyChanged? - PullRequest
1 голос
/ 05 октября 2010

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

public int Foo { get; set; }

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

Ответы [ 5 ]

2 голосов
/ 05 октября 2010

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

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

1 голос
/ 05 октября 2010

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

0 голосов
/ 18 февраля 2015

Сделайте это так

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

{public int NumberOfItems {get {return _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 {get;задавать;}

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

    return false;
}

}

Это извлечено из ответа выше, действительно помогло мне.

0 голосов
/ 05 октября 2010

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

См. этот вопрос StackOverflow и ответы для примера того, как это сделать.

0 голосов
/ 05 октября 2010

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

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

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

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

...