コード例 #1
0
        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);
                }
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        // 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;
            }
        }
コード例 #5
0
        // 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;
            }
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        // 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;
            }
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        public void RemoveEventHandler_NullDelegate_Nop()
        {
            var tokenTable = new EventRegistrationTokenTable <Delegate>();

            tokenTable.RemoveEventHandler(null);
        }