这可能是好几次被问过,但我找不到一个例子。
我的目标是为事件定义事件处理程序,处理程序应该是该类的成员。换句话说,我不想使用函数,因为我需要访问实例变量和成员
我尝试过的最新版本:
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
...
或者这可能是一种完全错误的做法?
答案 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.(...)
。