В .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");
}
}