【问题标题】:Command that depends on another command依赖于另一个命令的命令
【发布时间】:2012-08-20 10:56:09
【问题描述】:

我今天大部分时间都在尝试理解在 WPF/MVVM 中关闭对话框的许多不同方法。大多数答案都集中在简单的对话框上——比如是/否确认对话框。然而,似乎没有人描述一个更复杂的对话案例,它实际上执行一些操作,这些操作必须以事务方式提交:全有或全无。

有一个确定按钮,单击它会调用 ViewModel 上的绑定命令。一切都很好。

现在,如果命令成功,我想关闭窗口,但如果命令失败,我不想关闭它。

经过数小时的研究,我得出的结论是,显然世界上没有人遇到过类似的问题需要解决:|

我发明但尚未实施的解决方案如下:

  1. 我会有一个ConditionalCloseWindow 命令,它将窗口作为参数,然后关闭窗口。

  2. ConditionalCloseWindow 命令会有一个附加属性:

    公共静态只读 DependencyProperty 条件 = DependencyProperty.RegisterAttached("Condition", typeof(ICommand), ... snip
  3. 执行ConditionalCloseWindow 命令将首先导致Condition 命令的执行。只有成功执行Condition 命令,ConditionalCloseWindow 才会真正执行Close()

您如何看待这样的解决方案?完全无效吗?或者也许这是一种公认​​的模式,我没有通过我的研究成功地发现?

【问题讨论】:

    标签: wpf mvvm dialog dependency-properties


    【解决方案1】:

    有很多方法可以解决您的问题。我的第一个建议是,您的对话框 ViewModel 具有 action 类型的属性。您的对话框将该属性设置为关闭对话框的操作。在您的命令中,您可以调用该操作,您的对话框将关闭。

    【讨论】:

      【解决方案2】:

      有各种“表单”控件允许您编排事务,即支持验证、取消/确定逻辑、关闭等。

      您可以在“模型”上使用 IEditableObject 以事务方式处理更改的提交。

      【讨论】:

        【解决方案3】:

        一种方法是在 ViewModel 中设置 Closing 事件处理程序,例如:

        <i:Interaction.Triggers>
        <i:EventTrigger EventName="Closing">
            <command:EventToCommand Command="{Binding WindowClosing}" />
        </i:EventTrigger>
        </i:Interaction.Triggers>
        

        在 ViewModel 中:

        public ICommand WindowClosing
        {
            get
            {
                return _windowClosing ?? _windowClosing = new RelayCommand<CancelEventArgs>(
                    (args) =>{
                           if(somethingDoesNotMakeSense) 
                               args.Cancel = true;
                        });
            }
        }
        

        虽然这可能会有点混乱。

        另一个我想出来的;

                    <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <commandCall Command="ButtonClicked" />
                        <commmandCall Command="CloseWindow" Parameter="{Binding VIewModelCanWeClose}" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
        

        CloseWindow 应该是命令,在 Codebehind 中实现,它将进入参数“我们是否应该关闭”并根据它调用 Close()。

        【讨论】:

        • 不完全是我需要的,但我可以让它工作。它尽可能接近理想的解决方案。顺便说一句——“理想”可能不存在。
        猜你喜欢
        • 2012-03-25
        • 1970-01-01
        • 2020-02-29
        • 1970-01-01
        • 1970-01-01
        • 2017-07-19
        • 2014-04-14
        • 2019-12-25
        • 1970-01-01
        相关资源
        最近更新 更多