使用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

下一篇: WPF ICommand MVVM implementation