Ok, I think I figured it out. Take a replica from the Don Syme blog , in particular the section "Implementing the IEvent Module".
Instead of the following:
let validationFailedEvent = new Event<DataValidationEventHandler, DataValidationEventArgs>()
I had to implement IEvent myself and create a variable to hold the call list:
let mutable listeners: Delegate = null let validationFailedEvent = { new IEvent<DataValidationEventHandler, DataValidationEventArgs> with member x.AddHandler(d) = listeners <- Delegate.Combine(listeners, d) member x.RemoveHandler(d) = listeners <- Delegate.Remove(listeners, d) member x.Subscribe(observer) = let h = new Handler<_>(fun sender args -> observer.OnNext(args)) (x :?> IEvent<_,_>).AddHandler(h) { new System.IDisposable with member x.Dispose() = (x :?> IEvent<_,_>).RemoveHandler(h) } }
Then, to check if there are listeners, and if not, throw an exception:
member private x.fireValidationFailedEvent(e:DataValidationEventArgs) = match listeners with | null -> failwith "No listeners" | d -> d.DynamicInvoke([| box x; box e |])
source share