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