private void InnerRemove(TypedEventHandler <TSender, TResult> handler, Func <EventRegistrationToken> token) { // Check if we handlers bool wasNull = (eventTable.InvocationList == null); // Remove if (handler != null) { eventTable.RemoveEventHandler(handler); } else { eventTable.RemoveEventHandler(token()); } // Notify of remove if (observer != null) { observer.Removed(this); } // If last handler, notify if ((!wasNull) && (eventTable.InvocationList == null)) { if (lastRemoved != null) { lastRemoved(); } if (observer != null) { observer.LastRemoved(this); } } }
public void RemoveEventHandler_Token_RemovesFromTable() { EventHandler handler = new EventHandler(EventHandlerMethod1); var tokenTable = new EventRegistrationTokenTable <Delegate>(); EventRegistrationToken token = tokenTable.AddEventHandler(handler); tokenTable.RemoveEventHandler(token); Assert.Null(tokenTable.InvocationList); // Calls to RemoveEventHandler after removal are nops. tokenTable.RemoveEventHandler(token); }
public void RemoveEventHandler_MultipleTimes_RemovesSingleDelegateFromTable() { EventHandler handler = new EventHandler(EventHandlerMethod1); var tokenTable = new EventRegistrationTokenTable <Delegate>(); tokenTable.AddEventHandler(handler); tokenTable.AddEventHandler(handler); tokenTable.RemoveEventHandler(handler); Assert.Equal(new Delegate[] { handler }, tokenTable.InvocationList.GetInvocationList()); tokenTable.RemoveEventHandler(handler); Assert.Null(tokenTable.InvocationList); }
// void PropertyChanged.remove(EventRegistrationToken token) private void remove_CanExecuteChanged(EventRegistrationToken token) { ICommand _this = Unsafe.As <ICommand>(this); EventRegistrationTokenTable <EventHandler> table = s_weakTable.GetOrCreateValue(_this); if (table.RemoveEventHandler(token, out EventHandler handler)) { _this.CanExecuteChanged -= handler; } }
// void PropertyChanged.remove(EventRegistrationToken token) internal void remove_PropertyChanged(EventRegistrationToken token) { INotifyPropertyChanged _this = Unsafe.As <INotifyPropertyChanged>(this); EventRegistrationTokenTable <PropertyChangedEventHandler> table = s_weakTable.GetOrCreateValue(_this); if (table.RemoveEventHandler(token, out PropertyChangedEventHandler handler)) { _this.PropertyChanged -= handler; } }
public void AddEventHandler_Null_ReturnsZeroToken() { var tokenTable = new EventRegistrationTokenTable <Delegate>(); EventRegistrationToken token = tokenTable.AddEventHandler(null); Assert.Equal(0, token.GetHashCode()); // Removing this token should be a nop. tokenTable.RemoveEventHandler(token); }
// void CollectionChanged.remove(EventRegistrationToken token) internal void remove_CollectionChanged(EventRegistrationToken token) { INotifyCollectionChanged _this = Unsafe.As <INotifyCollectionChanged>(this); EventRegistrationTokenTable <NotifyCollectionChangedEventHandler> table = s_weakTable.GetOrCreateValue(_this); if (table.RemoveEventHandler(token, out NotifyCollectionChangedEventHandler? handler)) { _this.CollectionChanged -= handler; } }
public void RemoveEventHandler_Delegate_RemovesFromTable() { EventHandler handler1 = new EventHandler(EventHandlerMethod1); EventHandler handler2 = new EventHandler(EventHandlerMethod2); EventHandler combinedHandler = (EventHandler)Delegate.Combine(handler1, handler2); var tokenTable = new EventRegistrationTokenTable <Delegate>(); tokenTable.AddEventHandler(combinedHandler); tokenTable.RemoveEventHandler(handler1); tokenTable.RemoveEventHandler(handler2); Assert.Equal(new Delegate[] { handler1, handler2 }, tokenTable.InvocationList.GetInvocationList()); tokenTable.RemoveEventHandler(combinedHandler); Assert.Null(tokenTable.InvocationList); // Calls to RemoveEventHandler after removal are nops. tokenTable.RemoveEventHandler(combinedHandler); }
public void RemoveEventHandler_NullDelegate_Nop() { var tokenTable = new EventRegistrationTokenTable <Delegate>(); tokenTable.RemoveEventHandler(null); }