INotifyPropertyChanged лучшие практики - PullRequest
1 голос
/ 01 сентября 2011

Когда у меня есть класс, который реализует INotifyPropertyChanged, нормально ли выставлять реализацию как открытый метод?

Например, если у меня есть свойство с именем «Сумма» в классе, и я хочу, чтобы щелчок по кнопке в пользовательском интерфейсе обновлял сумму, каков наилучший способ сделать это?

Ниже приведен псевдокод для иллюстрации того, что я имею в виду

classinstance.NotifyPropertyChanged("Sum");
...
public Sum { 
   get { return x + y + z; }
}

Ответы [ 2 ]

1 голос
/ 17 июня 2012

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

Например ...

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

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

public object MyProperty
{
    get { return _myProperty; }
    set
    {
        _myProperty = value;
        OnPropertyChanged("MyProperty");
    }
}

Другие объекты могут затем подписаться на это событие и будут получать уведомления каждый раз, когда MyProperty свойство изменено.

Теперь, чтобы ответить на ваш вопрос о том, может ли метод OnPropertyChanged быть открытым.Ответ - да, но вы должны спросить себя, почему это так.

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

В вашем примере вы уведомляете, что свойство 'sum' было изменено.но это не так.Фактически, ваш код даже не позволяет изменять это свойство за пределами его собственного класса.

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

Представьте, что изменение свойства 'MyProperty', показанное ранее, также означает, что значение 'Сумма' изменилось тогда, что будет обработанокак это:

// This property is used by the 'sum' property so if this changes
// clients need to know that 'sum' has also changed.
public object MyProperty
{
    get { return _myProperty; }
    set
    {
        _myProperty = value;
        OnPropertyChanged("MyProperty");
        OnPropertyChanged("Sum");
    }
}
0 голосов
/ 07 декабря 2018

как и для более красивой реализации базы:

    public abstract class NotificationObject : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged<T>(Expression<Func<T>> me)
            => RaisePropertyChanged((me.Body as MemberExpression)?.Member.Name);

        protected virtual void RaisePropertyChanged(string propertyName)
            => PropertyChanged?.Invoke(this, propertyName);
    }

Также стоит поискать https://msdn.microsoft.com/en-us/magazine/mt736453.aspx

...