在MVVM下处理WPF中的“X”关闭按钮

问题描述 投票:0回答:3

我正在 WPF 中创建一个基本的数据库应用程序,并且我已经开始使用 MVVM 模式。

我有一个对话框,要求用户从

ListBox
中选择一个项目,然后单击“确定”。之后,我获取用户从视图模型中的属性中单击的项目并将其传递到另一个对话框中。但是,如果用户单击“取消”,我会将该值设置为
null
,并且操作会被取消:我不会打开下一个对话框并返回到主屏幕。示例:

public class SelectEquipmentViewModel : WorkspaceViewModel
{
    private bool _selected;

    public Equipment SelectedEquipment
    {
        // Item selected by the user
    }

    // Action for "SelectCommand," which is attached to
    // the "Select" button in the view
    public void ExecuteSelect()
    {
        _selected = true;

        // Fires a RequestClose event in WorkspaceViewModel,
        // which is attached to the view's Close method
        RequestClose();
    }

    public override void RequestClose()
    {
        if (!_selected)
        {
            // The user clicked "Cancel"
            SelectedEquipment = null;
        }

        base.RequestClose();
    }
}

这一直工作得很好,但是如果用户单击窗口控制框中的红色“X”关闭按钮,问题就会出现。永远不会调用

RequestClose
方法,并且所选项目未设置为
null
,这很糟糕。

我考虑过将视图模型附加到视图的

Closing
事件,但我觉得如果我开始为所有这些事件创建处理程序,这可能会变得混乱。

处理这种情况的“首选”方式是什么?

谢谢。

c# wpf mvvm
3个回答
1
投票

我认为使用 EventToCommand 行为将 Window 对象的 Closing 事件连接到新的 ExecuteCancel 命令非常干净。

public void ExecuteCancel() 
{ 
    _selected = false; 

    // Fires a RequestClose event in WorkspaceViewModel, 
    // which is attached to the view's Close method 
    RequestClose(); 
}

你认为这会在哪里变得混乱?如果添加“取消”按钮,它可以使用相同的“执行取消”位...


0
投票

行为是当用户使用 MVVM 按下窗口上的“X”按钮时要用来执行命令的行为。查看 Reed Copsey 的博客

您可以在此处下载示例应用程序...

我一直使用这个方法来让 ViewModel 管理视图的生命周期。


0
投票
在视图模型中处理窗口的关闭和关闭事件

以及提供的示例代码中描述了没有额外依赖项的方法。这不会在 xaml 后面添加代码。 (感谢里德·科普西的

链接

© www.soinside.com 2019 - 2024. All rights reserved.