public IReactiveBinding <TView, TViewModel, TProp> BindCommand <TView, TViewModel, TProp, TControl, TParam>( TViewModel viewModel, TView view, Expression <Func <TViewModel, TProp> > vmProperty, Expression <Func <TView, TControl> > controlProperty, IObservable <TParam> withParameter, string toEvent = null) where TViewModel : class where TView : class, IViewFor <TViewModel> where TProp : ICommand { var vmExpression = Reflection.Rewrite(vmProperty.Body); var controlExpression = default(Expression); if (controlProperty == null) { controlExpression = Reflection.getViewExpression(view, vmExpression); } else { controlExpression = Reflection.Rewrite(controlProperty.Body); } var source = Reflection.ViewModelWhenAnyValue(viewModel, view, vmExpression).Cast <TProp>(); IDisposable bindingDisposable = bindCommandInternal(source, view, controlExpression, withParameter, toEvent); return(new ReactiveBinding <TView, TViewModel, TProp>(view, viewModel, controlExpression, vmExpression, source, BindingDirection.OneWay, bindingDisposable)); }
public IReactiveBinding <TView, TViewModel, TProp> BindCommand <TView, TViewModel, TProp, TControl, TParam>( TViewModel viewModel, TView view, Expression <Func <TViewModel, TProp> > vmProperty, Expression <Func <TView, TControl> > controlProperty, Func <TParam> withParameter, string toEvent = null) where TViewModel : class where TView : class, IViewFor <TViewModel> where TProp : ICommand { var vmExpression = Reflection.Rewrite(vmProperty.Body); var controlExpression = default(Expression); if (controlProperty == null) { controlExpression = Reflection.getViewExpression(view, vmExpression); } else { controlExpression = Reflection.Rewrite(controlProperty.Body); } var source = Reflection.ViewModelWhenAnyValue(viewModel, view, vmExpression).Cast <TProp>(); IDisposable bindingDisposable = bindCommandInternal(source, view, controlExpression, Observable.Empty <object>(), toEvent, cmd => { var rc = cmd as IReactiveCommand; if (rc == null) { return(new RelayCommand(cmd.CanExecute, _ => cmd.Execute(withParameter()))); } var ret = ReactiveCommand.Create(rc.CanExecuteObservable); ret.Subscribe(_ => rc.Execute(withParameter())); return(ret); }); return(new ReactiveBinding <TView, TViewModel, TProp>(view, viewModel, controlExpression, vmExpression, source, BindingDirection.OneWay, bindingDisposable)); }