【发布时间】:2014-10-27 17:08:44
【问题描述】:
在 C# 中,您可以实现基于 PropertyChangedEventHandler 的扩展方法,如下所示:
static class VMExts
{
public static void RaisePropertyChanged(this PropertyChangedEventHandler handler, object sender, string propName)
{
if(handler != null)
{
handler(sender, new PropertyChangedEventArgs(propName));
}
}
}
可以这样调用:
class VM : INotifyPropertyChanged
{
private string _someText;
public event PropertyChangedEventHandler PropertyChanged;
public string SomeText
{
get { return _someText; }
set
{
_someText = value;
PropertyChanged.RaisePropertyChanged(this, "SomeText");
}
}
}
我一直试图在 F# 中实现类似的功能,但无法弄清楚语法。 通过继承一些 ViewModelBase 样式类(例如http://www.fssnip.net/2x)显然很容易实现这一点,但如果有一个扩展方法真的很好。
所以,给定这个类:
type ViewModelBase() =
let mutable _someText = ""
let propertyChanged = Event<_, _>()
interface INotifyPropertyChanged with
[<CLIEvent>]
member x.PropertyChanged = propertyChanged.Publish
member x.SomeText
with get() = _someText
and set(value) =
_someText <- value
(x :> INotifyPropertyChanged).PropertyChanged.RaisePropertyChanged("SomeText")
我试过了:
type PropertyChangedEventHandler with
member x.RaisePropertyChanged(sender, propName) =
if x <> null then
x.Invoke(sender, PropertyChangedEventArgs(propName))
和
open System.Runtime.CompilerServices
[<Extension>]
type VmExtensions() =
[<Extension>]
static member inline RaisePropertyChanged(handler : PropertyChangedEventHandler, propName) =
if handler <> null then
handler.Invoke(handler, PropertyChangedEventArgs(propName))
我认为这些无法找到对 PropertyChanged 有效,因为 PropertyChanged 的类型是 IEvent,而我已经扩展了 PropertyChangedEventHandler 类型。
于是我尝试了:
type IEvent<PropertyChangedEventHandler, PropertyChangedEventArgs> with
member x.RaisePropertyChanged(sender, propName) =
if x <> null then
x.Invoke(sender, PropertyChangedEventArgs(propName))
但是编译器不喜欢使用 IEvent
[<Extension>]
type VmExtensions() =
[<Extension>]
static member inline RaisePropertyChanged(handler : IEvent<PropertyChangedEventHandler, PropertyChangedEventArgs>, propName) =
// if handler <> null then
handler.Invoke(handler, PropertyChangedEventArgs(propName))
但是 IEvent 真的只有一个订阅方法
谢谢
【问题讨论】:
标签: mvvm f# extension-methods inotifypropertychanged