ReactiveUI 中的 ReactiveCommand 错误

ReactiveCommand bug in ReactiveUI

我将 Net40 ReactiveUI 与 Winforms 一起使用,当我只有这个时它工作正常:

public class VMUpdates : ReactiveObject
{
    ...

    public ReactiveCommand<object> btnClick { get; private set; }


    public VMUpdates(frmMain frmMain)
    {
        ...

        btnClick = ReactiveCommand.Create();
        btnClick.Subscribe(_ => ExecutableMethod());
    }

    private void ExecutableMethod()
    {
        ...
    }
}

还有这个:

public partial class FrmUpdates : Form, IViewFor<VMUpdates>
{       
   ...
    public FrmUpdates(frmMain)
    {
        ViewModel = new VMUpdates(FrmMain);//Initialise VM
        InitializeComponent();
        ...

        this.BindCommand(ViewModel, vm => vm.btnClick, view => view.btn);
    }

    public VMUpdates ViewModel { get; set; }

    object IViewFor.ViewModel
    {
        get { return ViewModel; }
        set { ViewModel = (VMUpdates)value; }
    }

但是一旦我将 ReactiveCommand 添加到完全不同的 VM,ExecutableMethod 方法就不再执行。

public class VMStatus : ReactiveObject
{
    public ReactiveCommand<object> btn2Click { get; private set; }

    public VMStatus()
    {
        btn2Click = ReactiveCommand.Create();
        btn2Click.Subscribe(_ => SomeMethod());
    }

    private void SomeMethod()
    {
        ...
    }
}

加上

 public partial class frmStatus : Form, IViewFor<VMStatus>
{

    public frmStatus()
    {
        ViewModel = new VMStatus();//Initialise VM
        InitializeComponent();
        ...

        this.BindCommand(ViewModel, vm => vm.btn2Click, view => view.button2);
    }
    public VMStatus ViewModel { get; set; }

    object IViewFor.ViewModel
    {
        get { return ViewModel; }
        set { ViewModel = (VMStatus)value; }
    }
}

编辑:当我将语法更改为此时它起作用了:

public ReactiveCommand<Unit> btnClick { get; private set; }

    public VMUpdates(frmMain frmMain)
    {
        ...
        btnClick = ReactiveCommand.CreateAsyncObservable(x => ExecutableMethod());            
    }

    public IObservable<Unit> ExecutableMethod()
    {
        return Observable.Start(() => {
            ...
        });
    }