potato
potato

Reputation: 41

ReactiveCommand bug in ReactiveUI

I'm using Net40 ReactiveUI with Winforms and it works fine when I have just this:

public class VMUpdates : ReactiveObject
{
    ...

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


    public VMUpdates(frmMain frmMain)
    {
        ...

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

    private void ExecutableMethod()
    {
        ...
    }
}

and this:

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; }
    }

but as soon as I add a ReactiveCommand to a completely different VM, the ExecutableMethod method doesn't execute anymore.

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

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

    private void SomeMethod()
    {
        ...
    }
}

plus

 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; }
    }
}

Upvotes: 1

Views: 147

Answers (1)

potato
potato

Reputation: 41

Edit: It worked when I changed the syntax to this instead:

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

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

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

Upvotes: 1

Related Questions