0

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

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

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

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

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

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

  2. ConditionalCloseWindow命令将具有附加属性:

    公共静态只读 DependencyProperty 条件 =
        DependencyProperty.RegisterAttached("Condition", typeof(ICommand), ... snip
    

  3. 执行ConditionalCloseWindow命令将首先导致命令的执行Condition。只有在成功执行Condition命令时才会ConditionalCloseWindow实际执行Close().

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

4

3 回答 3

1

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

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

在视图模型中:

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-08-25T09:25:29.003 回答
0

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

于 2012-08-24T21:36:53.020 回答
0

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

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

于 2012-08-24T23:18:42.917 回答