首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用WPF / MVVM Light Toolkit处理窗口关闭事件

用WPF / MVVM Light Toolkit处理窗口关闭事件
EN

Stack Overflow用户
提问于 2010-09-10 17:18:04
回答 9查看 211.9K关注 0票数 152

我希望处理窗口的Closing事件(当用户单击右上角的'X‘按钮时),以便最终显示确认消息或/和取消关闭。

我知道如何在代码隐藏中做到这一点:订阅窗口的Closing事件,然后使用CancelEventArgs.Cancel属性。

但是我使用的是MVVM,所以我不确定这是不是一个好的方法。

我认为最好的方法是将Closing事件绑定到我的ViewModel中的Command

我试过了:

代码语言:javascript
复制
<i:Interaction.Triggers>
    <i:EventTrigger EventName="Closing">
        <cmd:EventToCommand Command="{Binding CloseCommand}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

在我的ViewModel中有一个关联的RelayCommand,但是它不工作(命令的代码不会被执行)。

EN

回答 9

Stack Overflow用户

发布于 2011-12-06 18:11:36

这个选项更简单,也许更适合你。在视图模型构造函数中,您可以订阅主窗口关闭事件,如下所示:

代码语言:javascript
复制
Application.Current.MainWindow.Closing += new CancelEventHandler(MainWindow_Closing);

void MainWindow_Closing(object sender, CancelEventArgs e)
{
            //Your code to handle the event
}

万事如意。

票数 37
EN

Stack Overflow用户

发布于 2014-09-25 15:18:16

如果你不想了解ViewModel中的窗口(或它的任何事件),根据MVVM模式,这里有一个答案。

代码语言:javascript
复制
public interface IClosing
{
    /// <summary>
    /// Executes when window is closing
    /// </summary>
    /// <returns>Whether the windows should be closed by the caller</returns>
    bool OnClosing();
}

在ViewModel中添加接口和实现

代码语言:javascript
复制
public bool OnClosing()
{
    bool close = true;

    //Ask whether to save changes och cancel etc
    //close = false; //If you want to cancel close

    return close;
}

在窗口中,我添加了关闭事件。此代码隐藏不会破坏MVVM模式。视图可以知道视图模型!

代码语言:javascript
复制
void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    IClosing context = DataContext as IClosing;
    if (context != null)
    {
        e.Cancel = !context.OnClosing();
    }
}
票数 20
EN

Stack Overflow用户

发布于 2014-11-07 01:56:07

发问者应该使用STAS answer,但对于使用prism而不使用galasoft/mvvmlight的读者,他们可能想要尝试我使用的:

在顶部的窗口或用户控件等定义中,定义名称空间:

代码语言:javascript
复制
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

就在这个定义之下:

代码语言:javascript
复制
<i:Interaction.Triggers>
        <i:EventTrigger EventName="Closing">
            <i:InvokeCommandAction Command="{Binding WindowClosing}" CommandParameter="{Binding}" />
        </i:EventTrigger>
</i:Interaction.Triggers>

视图模型中的属性:

代码语言:javascript
复制
public ICommand WindowClosing { get; private set; }

在视图模型构造函数中附加委托命令:

代码语言:javascript
复制
this.WindowClosing = new DelegateCommand<object>(this.OnWindowClosing);

最后,您想要在关闭控件/窗口/任何东西时访问的代码:

代码语言:javascript
复制
private void OnWindowClosing(object obj)
        {
            //put code here
        }
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3683450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档