XAML从视图模型关闭窗口

22 浏览
0 Comments

XAML从视图模型关闭窗口

我有一个WPF窗口,数据上下文是使用XAML实例化的。当用户点击退出按钮时,我需要关闭这个窗口。我的问题是,如果使用XAML实例化了窗口,我该如何将窗口引用发送给ViewModel。我正在尝试保持MVVM模式,这就是为什么我在代码后台中没有任何代码的原因。

0
0 Comments

ViewModel中不应该包含窗口的引用,命令也不应该将窗口引用作为参数发送。如果你只想关闭窗口,可以在代码后台中执行,或者如果你仍然想在命令中执行,可以在命令处理程序中通过Application.Current.Windows找到窗口的引用并关闭它。

0
0 Comments

问题的出现原因:在MVVM中,通常不建议在ViewModel中直接关闭窗口。然而,有些情况下,我们仍然需要在ViewModel中关闭窗口,比如当我们需要根据业务逻辑条件来关闭窗口时。

解决方法:通过在XAML中声明窗口的Name属性,我们可以在ViewModel中访问窗口并关闭它。以下是解决方法的具体步骤:

1. 在XAML中声明窗口的Name属性,例如:

2. 在ViewModel中使用以下代码来关闭窗口:

Window window = Application.Current.Windows.OfType().Where(w => w.Name == "WindowName").FirstOrDefault();
if (window != null) window.Close();

这段代码的作用是通过遍历应用程序的窗口集合,找到Name属性为"WindowName"的窗口,并关闭它。

如果有多个相同类型的窗口实例,我们可以给它们分配不同的名称,并确保记录它们。当我们想关闭一个特定的窗口时,只需在示例代码中替换相关窗口的名称即可,代码会找到并关闭该窗口。

虽然在ViewModel中直接关闭窗口并不是MVVM的最佳实践,但在某些情况下,这是一个可行的解决方案。

0
0 Comments

问题出现的原因:

在这个内容中,我们看到了一个XAML代码片段,其中一个按钮的Command属性绑定到了一个ViewModel中的ICommandExit属性。这个属性被用于关闭窗口,并且传递了一个窗口作为参数。然而,这样的写法是有问题的,因为在ViewModel中不能直接操作窗口。

解决方法:

为了解决这个问题,我们可以通过使用一些额外的代码来实现从ViewModel关闭窗口。一种常见的做法是通过使用事件来通知窗口关闭。以下是解决方法的具体步骤:

1. 在ViewModel中定义一个事件,用于通知关闭窗口。可以使用如下代码:

public event EventHandler CloseWindowEvent;

2. 在ViewModel中实现一个方法,用于触发关闭窗口事件。可以使用如下代码:

private void OnCloseWindow()
   {
       CloseWindowEvent?.Invoke(this, EventArgs.Empty);
   }

3. 在窗口的代码-behind文件中,订阅ViewModel的CloseWindowEvent事件,并在事件处理方法中关闭窗口。可以使用如下代码:

private void ViewModel_CloseWindowEvent(object sender, EventArgs e)
   {
       this.Close();
   }

4. 在窗口的XAML中,绑定按钮的Command属性到ViewModel的一个命令,该命令会调用ViewModel的OnCloseWindow方法。可以使用如下代码:

<Button Command="{Binding _ICommandExit}" 
           CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=Window}}"
           Click="ViewModel_CloseWindowEvent"/>

通过这种方式,我们可以在ViewModel中关闭窗口,并通过事件通知窗口进行关闭操作,避免了在ViewModel中直接操作窗口的问题。这样就可以实现从ViewModel关闭窗口的功能。

0