当我有一个实现INotifyPropertyChanged的类时,可以将实现暴露为公共方法吗?
例如,如果我在一个类中有一个名为"Sum"的属性,并且我想在UI中单击按钮来更新Sum,那么最好的方法是什么?
下面是一些伪代码来说明我的意思
classinstance.NotifyPropertyChanged("Sum");
...
public Sum {
get { return x + y + z; }
}
在。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属性需要重新计算,因为一个依赖的属性已经改变了。如果是这种情况,那么当依赖的属性发生变化时,你需要引发一个property changed事件。
想象一下,前面显示的'MyProperty'属性的变化也意味着'Sum'发生了变化,那么将像这样处理:
// 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");
}
}
为更漂亮的实现基础:
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