Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理",;X";MVVM下WPF中的关闭按钮_C#_Wpf_Mvvm - Fatal编程技术网

C# 处理",;X";MVVM下WPF中的关闭按钮

C# 处理",;X";MVVM下WPF中的关闭按钮,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在WPF中创建一个基本的数据库应用程序,并且已经开始使用MVVM模式 我有一个对话框,要求用户从列表框中选择一个项目,然后单击“确定”。然后,我从视图模型中的属性中获取用户单击的项目,并将其传递到另一个对话框中。但是,如果用户单击“取消”,我将该值设置为null,操作被取消:我不会打开下一个对话框并返回主屏幕。例如: public class SelectEquipmentViewModel : WorkspaceViewModel { private bool _selected;

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

我有一个对话框,要求用户从
列表框
中选择一个项目,然后单击“确定”。然后,我从视图模型中的属性中获取用户单击的项目,并将其传递到另一个对话框中。但是,如果用户单击“取消”,我将该值设置为
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
,这是错误的

我曾考虑将视图模型附加到视图的
关闭
事件,但如果我开始为所有这些事件创建处理程序,我觉得这可能会变得混乱

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


谢谢。

我认为使用EventToCommand行为将窗口对象的关闭事件连接到新的ExecuteCancel命令非常简单

public void ExecuteCancel() 
{ 
    _selected = false; 

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

你认为这会在哪里变得混乱?如果添加取消按钮,它可能会使用相同的ExecuteCancel位…

当用户使用MVVM按下窗口上的“X”按钮时,您希望使用这些行为来执行命令。查看Reed Copsey的博客:

您可以下载一个示例应用程序


我一直使用此方法,以允许ViewModel管理视图的生命周期。

文章和代码中描述了无附加依赖项的方法,并提供了示例。这不会在xaml后面添加代码


(感谢Reed Copsey)

据我所知,这是在M-V-VM中实现这一点的最佳方法。在某些情况下,您仍然必须在代码隐藏类中添加一些逻辑,就像您不喜欢使用M-V-VM那样。