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(() => {
...
});
}
我将 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(() => {
...
});
}