附加命令

时间:2016-11-16 09:49:59

标签: c# wpf mvvm command

TL; DR 是否可以将异步可取消命令附加到包含子项的Parent-View-Model

我的问题是,我ViewModel View显示“ WizardControl ”(就像安装助手一样,你可以点击下一步获取到下一个视图) Wizard Control

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之前的实现是我在页面上有一个额外的“登录”按钮来点击,只允许在用户登录时进入下一步,但这是糟糕的用户体验

1 个答案:

答案 0 :(得分:2)

为什么它必须是命令?如果您不想将登录功能直接绑定到按钮,请不要提供命令,请使用以下方法:

ForwardCommand = new DelegateCommand( async () =>
{
    if (await _currentlyShownWizardPage.DoYourStuffThatHappensWhenTheUserClicksNext())
        GoToNextPage();
});

替代方法是以相反的方式构建它:将向导页面的命令绑定到下一个按钮(以及向导页面也提供的按钮内容),并具有向导页面' s命令将向导推进到下一页(通过提供给向导页面的IWizard服务)。