解决方案一:
你可以用这个RaisePropertyChangedExtension
:
public static class RaisePropertyChangedExtension
{
public static void RaisePropertyChanged(this INotifyPropertyChanged @this, [CallerMemberName] string propertyName = null)
{
var declaringType = @this.GetType().GetEvent(nameof(INotifyPropertyChanged.PropertyChanged)).DeclaringType;
var propertyChangedFieldInfo = declaringType.GetField(nameof(INotifyPropertyChanged.PropertyChanged), BindingFlags.Instance | BindingFlags.NonPublic);
var propertyChangedEventHandler = propertyChangedFieldInfo.GetValue(@this) as PropertyChangedEventHandler;
propertyChangedEventHandler?.Invoke(@this, new PropertyChangedEventArgs(propertyName));
}
}
像这样:
public class B : A
{
private object _someProperty;
public object SomeProperty
{
get => _someProperty;
set
{
_someProperty = value;
this.RaisePropertyChanged();
}
}
}
在我看来,这是迄今为止我所知道的最好的解决方案。
缺点是你可以提高PropertyChanged
来自另一个类,如下所示:
public class C
{
public C(B b)
{
b.RaisePropertyChanged(nameof(b.SomeProperty));
}
}
这不是好的做法PropertyChanged
从其他班级通过这种方式,所以我不担心这个缺点。
该解决方案的灵感来自托马斯·莱维斯克 https://stackoverflow.com/users/98713/thomas-levesque的回答在这里:简单的小型 INotifyPropertyChanged 实现 https://stackoverflow.com/a/3851173/7108481
解决方案2:
您可以创建一个受保护的RaisePropertyChanged
在基类中A
:
public class A : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
并调用派生类中的方法B
:
public class B : A
{
private object _someProperty;
public object SomeProperty
{
get => _someProperty;
set
{
_someProperty = value;
RaisePropertyChanged();
}
}
}
缺点是你必须实施RaisePropertyChanged
相反,您创建的每个新基类的方法可以避免以下缺点:解决方案1 had.