我希望处理窗口的Closing
事件(当用户单击右上角的'X‘按钮时),以便最终显示确认消息或/和取消关闭。
我知道如何在代码隐藏中做到这一点:订阅窗口的Closing
事件,然后使用CancelEventArgs.Cancel
属性。
但是我使用的是MVVM,所以我不确定这是不是一个好的方法。
我认为最好的方法是将Closing
事件绑定到我的ViewModel中的Command
。
我试过了:
<i:Interaction.Triggers>
<i:EventTrigger EventName="Closing">
<cmd:EventToCommand Command="{Binding CloseCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
在我的ViewModel中有一个关联的RelayCommand
,但是它不工作(命令的代码不会被执行)。
发布于 2011-12-06 18:11:36
这个选项更简单,也许更适合你。在视图模型构造函数中,您可以订阅主窗口关闭事件,如下所示:
Application.Current.MainWindow.Closing += new CancelEventHandler(MainWindow_Closing);
void MainWindow_Closing(object sender, CancelEventArgs e)
{
//Your code to handle the event
}
万事如意。
发布于 2014-09-25 15:18:16
如果你不想了解ViewModel中的窗口(或它的任何事件),根据MVVM模式,这里有一个答案。
public interface IClosing
{
/// <summary>
/// Executes when window is closing
/// </summary>
/// <returns>Whether the windows should be closed by the caller</returns>
bool OnClosing();
}
在ViewModel中添加接口和实现
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模式。视图可以知道视图模型!
void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
IClosing context = DataContext as IClosing;
if (context != null)
{
e.Cancel = !context.OnClosing();
}
}
发布于 2014-11-07 01:56:07
发问者应该使用STAS answer,但对于使用prism而不使用galasoft/mvvmlight的读者,他们可能想要尝试我使用的:
在顶部的窗口或用户控件等定义中,定义名称空间:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
就在这个定义之下:
<i:Interaction.Triggers>
<i:EventTrigger EventName="Closing">
<i:InvokeCommandAction Command="{Binding WindowClosing}" CommandParameter="{Binding}" />
</i:EventTrigger>
</i:Interaction.Triggers>
视图模型中的属性:
public ICommand WindowClosing { get; private set; }
在视图模型构造函数中附加委托命令:
this.WindowClosing = new DelegateCommand<object>(this.OnWindowClosing);
最后,您想要在关闭控件/窗口/任何东西时访问的代码:
private void OnWindowClosing(object obj)
{
//put code here
}
https://stackoverflow.com/questions/3683450
复制相似问题