user6423491
user6423491

Reputation: 97

Defining member as event handler in F#

This is probably asked several times but I just can't find an example.

My goal is to define an event handler for an event and the handler should be a member of the class. In other words I don't want to use function since I need to access instance variables and members

The latest variation I've tried:

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
            ...

Or is this maybe a completely wrong approach?

Upvotes: 2

Views: 146

Answers (1)

Vandroiy
Vandroiy

Reputation: 6223

Looks like you're looking for the self-identifier syntax:

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

The as this (or any other identifier in place of this) allows to refer to the instance being constructed from the constructor.

You could then change your other lines to use the identifier:

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

do this.CollectionChanged.AddHandler(collectionChangedHandler)

For this to be valid as-is, the ValueList_CollectionChanged method also needs to be in curried form:

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

As an alternative to using curried arguments, you can use a lambda to transform the arguments where the handler is instantiated, e.g. .NotifyCollectionChangedEventHandler(fun sender e -> this.(...).

Upvotes: 3

Related Questions