TL; DR 是否可以将异步可取消命令附加到包含子项的Parent-View-Model
我的问题是,我ViewModel
View
显示“ WizardControl ”(就像安装助手一样,你可以点击下一步获取到下一个视图)
Log in
按钮是Parent-View-Model
的一部分,要为此按钮执行的命令必须是来自Specific Page
(也就是孩子)的命令和MainWindow
(又名父母)。
现在我正在父母的命令中执行孩子的命令:
ForwardCommand = new DelegateCommand(() =>
{
CancelEventArgs cea = new CancelEventArgs();
if (NextCommand != null)
{
NextCommand.Execute(null, cea));
if (!cea.Cancel)
{
//Go to next page
}
//Else stay on that page because an error occured while the command
}
},
(nul)=> {
if (NextCommand != null)
{
return true;
}
return NextCommand.CanExecute(nul);
});
这是有效的,只要包含命令不需要异步执行,Login
就是这种情况。因为这样就显示了下一页,而没有用户登录以获取下一页所需的数据。 (登录时会在第一页显示加载栏)。对于这种情况,执行Child-Command
时发生错误我实现了CancelEventArgs,如代码所示。
提前致谢,
FLO
PS。 The DelegateCommand
是由CancellationEventArgs
修改
我在Attached Commands
之前的实现是我在页面上有一个额外的“登录”按钮来点击,只允许在用户登录时进入下一步,但这是糟糕的用户体验
答案 0 :(得分:2)
为什么它必须是命令?如果您不想将登录功能直接绑定到按钮,请不要提供命令,请使用以下方法:
ForwardCommand = new DelegateCommand( async () =>
{
if (await _currentlyShownWizardPage.DoYourStuffThatHappensWhenTheUserClicksNext())
GoToNextPage();
});
替代方法是以相反的方式构建它:将向导页面的命令绑定到下一个按钮(以及向导页面也提供的按钮内容),并具有向导页面' s命令将向导推进到下一页(通过提供给向导页面的IWizard
服务)。