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

Creating a fake command, am I doing it wrong?

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

为了实现这个,我创建了两个命令。用户发起登录一条命令,自动登录一条命令。这样我就可以观察到两个命令的 IsExecuting Observable,就像这样

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

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

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

我的问题是,执行此操作的更简洁方法是什么?我可以在没有两个命令的情况下执行此操作吗?干杯。

我认为你的方法没问题,我也有类似的情况,我在不同的命令上有自动登录和登录,如果你仔细想想,自动登录和登录是不同的东西,至少对我来说是这样。我唯一会做的不同就是把 CmdAutoLogin 在视图上执行,而不是在视图模型中执行:

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

您不需要强制转换为 ICommand。

导入此命名空间:

using System.Reactive.Linq;

然后等待命令:

await CmdAutoLogin.Execute();

或者使用 Adrian Romero 的方式:

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