public void BindCommandToObjectWithEventCommandIsArgumentNull()
        {
            var vm   = new CommandBindingViewModel();
            var view = new CommandBindingView {
                ViewModel = vm
            };

            var invokeCount = 0;

            vm.Command2.Subscribe(_ => invokeCount++);
            var btn = new Button();
            var cmd = (btn as ICommand) !;
            var sub = new Subject <object>();

            Assert.Throws <TargetInvocationException>(() =>
            {
                var disp = CreatesCommandBinding.BindCommandToObject(cmd, view, sub, "PropertyChanged");

                view.Command2.RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left)
                {
                    RoutedEvent = UIElement.MouseUpEvent
                });

                disp.Dispose();

                view.Command2.RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left)
                {
                    RoutedEvent = UIElement.MouseUpEvent
                });
            });

            Assert.Equal(0, invokeCount);
        }
        public void BindCommandToObjectTargetIsNull()
        {
            var vm   = new CommandBindingViewModel();
            var view = new CommandBindingView {
                ViewModel = vm
            };

            var invokeCount = 0;

            vm.Command2.Subscribe(_ => invokeCount++);

            var sub = new Subject <object>();

            Assert.Throws <Exception>(() =>
            {
                var disp = CreatesCommandBinding.BindCommandToObject(vm.Command2, true, sub);

                view.Command2.RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left)
                {
                    RoutedEvent = UIElement.MouseUpEvent
                });

                disp.Dispose();

                view.Command2.RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left)
                {
                    RoutedEvent = UIElement.MouseUpEvent
                });
            });

            Assert.Equal(0, invokeCount);
        }
    private static IDisposable BindCommandInternal <TView, TProp, TParam>(
        IObservable <TProp> source,
        TView view,
        Expression controlExpression,
        IObservable <TParam> withParameter,
        string?toEvent)
        where TView : class, IViewFor
        where TProp : ICommand
    {
        var disposable = Disposable.Empty;

        var bindInfo = source.CombineLatest(
            view.SubscribeToExpressionChain <TView, object?>(controlExpression, false, false, RxApp.SuppressViewCommandBindingMessage).Select(x => x.GetValue()),
            (val, host) => new { val, host });

        var propSub = bindInfo
                      .Subscribe(x =>
        {
            if (x.host is null)
            {
                return;
            }

            disposable.Dispose();
            if (x is null)
            {
                disposable = Disposable.Empty;
                return;
            }

            disposable = !string.IsNullOrEmpty(toEvent) ?
                         CreatesCommandBinding.BindCommandToObject(x.val, x.host, withParameter.Select(y => (object)y !), toEvent) :
                         CreatesCommandBinding.BindCommandToObject(x.val, x.host, withParameter.Select(y => (object)y !));
        });

        return(Disposable.Create(() =>
        {
            propSub.Dispose();
            disposable.Dispose();
        }));
    }