在F#中将成员定义为事件处理程序

时间:2016-06-05 18:23:54

标签: f#

这可能是好几次被问过,但我找不到一个例子。

我的目标是为事件定义事件处理程序,处理程序应该是该类的成员。换句话说,我不想使用函数,因为我需要访问实例变量和成员

我尝试过的最新版本:

namespace A
    type ValueList<'TValueItem when 'TValueItem :> IValueItem>() =
        inherit System.Collections.ObjectModel.ObservableCollection<'TValueItem>()

        // This is causing error: The value or constructor 'ValueList_CollectionChanged' is not defined
        let collectionChangedHandler = new System.Collections.Specialized.NotifyCollectionChangedEventHandler(ValueList_CollectionChanged)

        // Constructor code
        do base.CollectionChanged.AddHandler(collectionChangedHandler)

        // Handles collection changed events for data items
        member this.ValueList_CollectionChanged(sender : obj, e : System.Collections.Specialized.NotifyCollectionChangedEventArgs) =
            // The code I want to run goes here
            ...

或者这可能是一种完全错误的做法?

1 个答案:

答案 0 :(得分:3)

您似乎正在寻找自我标识符语法:

type ValueList<'TValueItem when 'TValueItem :> IValueItem>() as this =

as this(或代替this的任何其他标识符)允许引用从构造函数构造的实例。

然后,您可以更改其他行以使用标识符:

let collectionChangedHandler = new System.Collections.Specialized.NotifyCollectionChangedEventHandler(this.ValueList_CollectionChanged)

do this.CollectionChanged.AddHandler(collectionChangedHandler)

为了使其有效,ValueList_CollectionChanged方法也需要采用咖喱形式:

member this.ValueList_CollectionChanged (sender : obj) (e : System.Collections.Specialized.NotifyCollectionChangedEventArgs) =

作为使用curried参数的替代方法,您可以使用lambda转换实例化处理程序的参数,例如: .NotifyCollectionChangedEventHandler(fun sender e -> this.(...)