【问题标题】:Attached Command附加命令
【发布时间】:2017-03-30 10:57:46
【问题描述】:

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

我的问题是,我有一个ViewViewModel,它显示一个“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,如您在代码中看到的那样。

提前致谢,
弗洛尔

PS。 The DelegateCommand 是由CancellationEventArgs 扩展的自制实现

编辑:
我在Attached Commands 之前的实现是我在页面上有一个额外的“登录”按钮可以点击,并且只有在用户登录时才允许进入下一步,但这是糟糕的用户体验

【问题讨论】:

    标签: c# wpf mvvm command


    【解决方案1】:

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

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

    另一种方法是反过来构建它:将向导页面的命令绑定到下一个按钮(连同向导页面也提供的按钮内容),并让向导页面的命令将向导推进到下一页(通过提供给向导页面的IWizard 服务)。

    【讨论】:

    • 之所以选择Command是因为我也需要can-next的逻辑,所以基本都是在ViewModel中选择Command的平均理由^^
    • ICommand 尖叫 将我绑定到一个按钮...如果您在(业务)逻辑中使用它,您可能会混淆用户,并牺牲灵活性,因为ICommand.Execute 不是async,它的参数只是一个对象,仅举两个最明显的限制。当您离开 ui 时,整个 CanExecute/Execute-system 更成问题,因为您离开了单个 ui 线程的上下文。一般来说,即使 CanExecute 返回 true,但在您调用 Execute 的那一刻,它也可能是 false(反之亦然),在某种程度上使其毫无意义。
    • 为了使东西线程安全,我实现了if (Interlocked.Read(ref isExecuting) != 0)Interlocked.Exchange(ref isExecuting, 1);,所以在执行时我以线程安全的方式将其设置为1,否则设置为0。 ICommand 尖叫将我绑定到一个按钮:基本上这就是我想要的,我想将一个命令绑定到一个按钮,但我的按钮在 ParentView 内,另一个 ViewModel 负责它.我只需要一个命令的参数,这是出于安全原因的登录命令(密码框问题)
    • 所以基本上这将是最简单的,如果我可以在特定视图中拥有“下一步”按钮并将命令直接绑定到它。但这会破坏 DRY 原则,因为我会为每个视图实现按钮。
    • DRY 适用于您设计的课程,如果某些 ui 人员创建的屏幕设计中每个屏幕都有相同的按钮,那不是您的错 ;-)
    猜你喜欢
    • 2010-11-29
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    相关资源
    最近更新 更多