Vit*_*ova 15 c# wpf extension-methods propertychanged inotifypropertychanged
我试图编写一个类来避免像"RaisePropertyChanged"这样的方法.我知道我可以从具有该实现的类继承,但在某些情况下我不能.我尝试使用扩展方法,但Visual Studio抱怨.
public static class Extension
{
public static void RaisePropertyChanged(this INotifyPropertyChanged predicate, string propertyName)
{
if (predicate.PropertyChanged != null)
{
predicate.PropertyChanged(propertyName, new PropertyChangedEventArgs(propertyName));
}
}
}
Run Code Online (Sandbox Code Playgroud)
它说:
"事件' System.ComponentModel.INotifyPropertyChanged.PropertyChanged'只能出现在+ =或 - =的左侧 "
Dan*_*Tao 20
里德是对的.但是,我看到你正在尝试做什么(让你的代码可以重用 - 对你有好处); 我只想指出,通常可以通过接受PropertyChangedEventHandler 委托本身并在INotifyPropertyChanged实现中传递它来轻松纠正:
public static void Raise(this PropertyChangedEventHandler handler, object sender, string propertyName)
{
if (handler != null)
{
handler(sender, new PropertyChangedEventArgs(propertyName));
}
}
Run Code Online (Sandbox Code Playgroud)
然后从您实现的类中INotifyPropertyChanged,您可以像这样调用此扩展方法:
PropertyChanged.Raise(this, "MyProperty");
Run Code Online (Sandbox Code Playgroud)
这是因为,正如Marc所说,在声明事件的类中,您可以像字段一样访问它(这意味着您可以将它作为委托参数传递给方法,包括扩展方法).
Ree*_*sey 11
您只能从定义它的类中引发事件.
这一行:
predicate.PropertyChanged(propertyName, new PropertyChangedEventArgs(propertyName));
Run Code Online (Sandbox Code Playgroud)
将失败,因为predicate不是定义此扩展方法的类.
这部分原因通常是通过基类而不是使用Extension方法处理的.