创建假命令,我做错了吗?

时间:2018-05-28 13:42:18

标签: reactiveui

我已经为应用程序实现了登录对话框。当"登录"单击按钮,将禁用UI,并在登录时显示微调器。此外,如果用户之前已登录,则应用程序可以使用已保存的令牌自动重新登录。

为了实现这一点,我创建了两个命令。一个用于用户启动的登录的命令,一个用于自动登录的命令。这样我可以观察两个命令的IsExecuting Observable,类似这样的

_isExecuting = this.WhenAnyObservable(
    x => x.CmdLogin.IsExecuting,
    x => x.CmdAutoLogin.IsExecuting)
.ToProperty(this, x => x.IsExecuting);

然后将IsExecuting viewmodel属性绑定到视图的Isnabled属性。这是有效的,UI表现得很完美,但是有两个命令感觉非常不干净。另外,我正在触发viewmodel中的自动登录,如下所示:

this.WhenActivated((Action<IDisposable> disposer) =>
{
    (CmdAutoLogin as System.Windows.Input.ICommand).Execute(null);
});

我的问题是,更清洁的方法是什么?没有两个命令我可以这样做吗?欢呼声。

2 个答案:

答案 0 :(得分:1)

我认为你的方法没问题,我处于类似的情况,我有单独的命令AutoLogin和登录,如果你考虑一下,自动登录和登录是不同的事情,至少对我而言。我唯一不同的就是放 CmdAutoLogin 在视图上执行,而不是在视图模型中执行:

this.WhenActivated(disposables =>
        {
            Observable.Return(Unit.Default).InvokeCommand(ViewModel.CmdAutoLogin);
        });

答案 1 :(得分:1)

您无需强制转换为ICommand。

导入此命名空间:

using System.Reactive.Linq;

然后等待命令:

await CmdAutoLogin.Execute();

或者使用Adrian Romero的方式:

Observable.Return(Unit.Default).InvokeCommand();