예제 #1
0
        public void WeakEventTest()
        {
            var listener1Success = false;

            var eventPublisher = new TestEventPublisher();

            var listener1 = new LivetWeakEventListener <EventHandler, EventArgs>(
                h => new EventHandler(h),
                h => eventPublisher.EmptyEvent += h,
                h => eventPublisher.EmptyEvent -= h,
                (sender, e) => listener1Success = true);

            var listenerWeakReference = new WeakReference(listener1);

            //------------------
            listener1Success.Is(false);

            eventPublisher.RaiseEmptyEvent();

            listener1Success.Is(true);

            //------------------
            listener1Success = false;

            listener1 = null;

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();

            eventPublisher.RaiseEmptyEvent();

            listener1Success.Is(false);
        }
예제 #2
0
        public void LifeCycleTest()
        {
            var listener1Success = false;

            var eventPublisher = new TestEventPublisher();

            var listener1 = new LivetWeakEventListener <EventHandler, EventArgs>(
                h => new EventHandler(h),
                h => eventPublisher.EmptyEvent += h,
                h => eventPublisher.EmptyEvent -= h,
                (sender, e) => listener1Success = true);

            //------------------
            listener1Success.Is(false);

            eventPublisher.RaiseEmptyEvent();

            listener1Success.Is(true);

            //------------------
            listener1Success = false;

            listener1.Dispose();
            eventPublisher.RaiseEmptyEvent();

            listener1Success.Is(false);
        }
예제 #3
0
        public void WeakEventTest()
        {
            var listener1Success = false;

            var eventPublisher = new TestEventPublisher();

            var listener1 = new LivetWeakEventListener<EventHandler, EventArgs>(
                h => new EventHandler(h),
                h => eventPublisher.EmptyEvent += h,
                h => eventPublisher.EmptyEvent -= h,
                (sender, e) => listener1Success = true);

            var listenerWeakReference = new WeakReference(listener1);

            //------------------
            listener1Success.Is(false);

            eventPublisher.RaiseEmptyEvent();

            listener1Success.Is(true);

            //------------------
            listener1Success = false;

            listener1 = null;

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();

            eventPublisher.RaiseEmptyEvent();

            listener1Success.Is(false);
        }
예제 #4
0
        public void LifeCycleTest()
        {
            var listener1Success = false;

            var eventPublisher = new TestEventPublisher();

            var listener1 = new LivetWeakEventListener<EventHandler, EventArgs>(
                h => new EventHandler(h),
                h => eventPublisher.EmptyEvent += h,
                h => eventPublisher.EmptyEvent -= h,
                (sender, e) => listener1Success = true);

            //------------------
            listener1Success.Is(false);

            eventPublisher.RaiseEmptyEvent();

            listener1Success.Is(true);

            //------------------
            listener1Success = false;

            listener1.Dispose();
            eventPublisher.RaiseEmptyEvent();

            listener1Success.Is(false);
        }
예제 #5
0
        LivetWeakEventListener<KeyEventHandler, KeyEventArgs> _listener; //strong reference of listener

        #endregion Fields

        #region Constructors

        public ReceiverTextBoxKeyDown(TextBox t, ICommand command)
        {
            _listener = new LivetWeakEventListener<KeyEventHandler, KeyEventArgs>(
                        h => new KeyEventHandler(h),
                        h => t.KeyDown += h,
                        h => t.KeyDown -= h,
                        OnKeyDownEvent);
            this._command = command;
        }
예제 #6
0
 public MessageListener(InteractionMessenger messenger)
 {
     Dispatcher = Dispatcher.CurrentDispatcher;
     _source    = new WeakReference <InteractionMessenger>(messenger);
     _listener  = new LivetWeakEventListener <EventHandler <InteractionMessageRaisedEventArgs>, InteractionMessageRaisedEventArgs>
                  (
         h => h,
         h => messenger.Raised += h,
         h => messenger.Raised -= h,
         MessageReceived
                  );
 }
예제 #7
0
        public MessageListener([NotNull] InteractionMessenger messenger)
        {
            if (messenger == null)
            {
                throw new ArgumentNullException(nameof(messenger));
            }

            _dispatcher = Dispatcher.CurrentDispatcher;
            _source     = new WeakReference <InteractionMessenger>(messenger);
            _listener   =
                new LivetWeakEventListener <EventHandler <InteractionMessageRaisedEventArgs>,
                                            InteractionMessageRaisedEventArgs>
                (
                    h => h,
                    h => messenger.Raised += h,
                    h => messenger.Raised -= h,
                    MessageReceived
                );
        }
예제 #8
0
        /// <summary>
        /// 渡された View を元に、DataContext(=ViewModel), Messenger を取得して、イベント購読して、メッセージキーに応じた各処理をおこないます。
        /// </summary>
        /// <param name="view">Window</param>
        private static void AutoReceiveOperationChangedInternal(DependencyObject view)
        {
            if (!(view is Window))
            {
                return;
            }

            var window = view as Window;

            if (_WindowCache == null)
            {
                _WindowCache = new Dictionary <string, LivetWeakEventListener <DependencyPropertyChangedEventHandler, DependencyPropertyChangedEventArgs> >();
            }

            // DataContext が null の場合処理を抜けてしまうので、抜ける前に変更監視と再開処理を残しておく
            // View 単位で確保しておく
            var keyName = window.GetType().FullName;

            if (!_WindowCache.ContainsKey(keyName))
            {
                var listener = new LivetWeakEventListener <DependencyPropertyChangedEventHandler, DependencyPropertyChangedEventArgs>(
                    h => new DependencyPropertyChangedEventHandler(h),
                    h => window.DataContextChanged += h,
                    h => window.DataContextChanged -= h,
                    (s, e) => AutoReceiveOperationChangedInternal(s as DependencyObject));

                _WindowCache.Add(keyName, listener);
            }

            if (window.DataContext == null)
            {
                return;
            }

            var dataContext = window.DataContext;

            if (!(dataContext is ViewModel))
            {
                return;
            }

            var vm        = dataContext as ViewModel;
            var messenger = vm.Messenger;

            if (_MessengerCache == null)
            {
                _MessengerCache = new Dictionary <string, LivetWeakEventListener <EventHandler <InteractionMessageRaisedEventArgs>, InteractionMessageRaisedEventArgs> >();
            }

            // ViewModel 単位で確保しておく
            keyName = $"{vm.GetType().FullName}.{messenger.GetType().Name}";
            if (!_MessengerCache.ContainsKey(keyName))
            {
                var listener = new LivetWeakEventListener <EventHandler <InteractionMessageRaisedEventArgs>, InteractionMessageRaisedEventArgs>(
                    h => new EventHandler <InteractionMessageRaisedEventArgs>(h),
                    h => messenger.Raised += h,
                    h => messenger.Raised -= h,
                    (s, e) => Messenger_Raised(window, s, e));

                _MessengerCache.Add(keyName, listener);
            }
        }