我已经为应用程序实现了登录对话框。当"登录"单击按钮,将禁用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);
});
我的问题是,更清洁的方法是什么?没有两个命令我可以这样做吗?欢呼声。
答案 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();