使用WPF / MVVM Light Toolkit处理窗口关闭事件
我想处理窗口的“关闭”事件(当用户点击右上角的'X'按钮),以便最终显示确认消息或/并取消关闭。
我知道如何在代码隐藏中做到这一点:订阅窗口的“关闭”事件,然后使用“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,但它不起作用(该命令的代码没有执行)。
我只想在View构造函数中关联处理程序:
MyWindow()
{
// Set up ViewModel, assign to DataContext etc.
Closing += viewModel.OnWindowClosing;
}
然后将处理程序添加到ViewModel
:
public void OnWindowClosing(object sender, CancelEventArgs e)
{
// Handle closing logic, set e.Cancel as needed
}
在这种情况下,除了复杂性之外,通过使用更加精细的模式和更多的间接方式(5条额外的XML
加命令模式),您只能获得任何东西。
“零代码隐藏”的口头禅本身并不是目标,关键是将ViewModel从View中分离出来 。 即使事件绑定在View的代码隐藏中, ViewModel
也不依赖于View,并且可以对闭合逻辑进行单元测试 。
这段代码工作得很好:
ViewModel.cs:
public ICommand WindowClosing
{
get
{
return new RelayCommand<CancelEventArgs>(
(args) =>{
});
}
}
并在XAML中:
<i:Interaction.Triggers>
<i:EventTrigger EventName="Closing">
<command:EventToCommand Command="{Binding WindowClosing}" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
当然,ViewModel被分配给主容器的DataContext。
这个选项更容易,也许适合你。 在您的视图模型构造函数中,您可以像这样订阅主窗口关闭事件:
Application.Current.MainWindow.Closing += new CancelEventHandler(MainWindow_Closing);
void MainWindow_Closing(object sender, CancelEventArgs e)
{
//Your code to handle the event
}
祝一切顺利。
链接地址: http://www.djcxy.com/p/56123.html上一篇: Handling the window closing event with WPF / MVVM Light Toolkit