c# - MVVM App,窗口关闭期间方法的确切顺序是什么

标签 c# wpf mvvm

我试图在窗口关闭之前在虚拟机上执行一些操作,这意味着我需要 DataContext 必须可用于我的操作。

实际上我正在尝试这个:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Closing">
        <cmd:EventToCommand Command="{Binding _MyCleanUpCommand}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>

但是,此时我的 ViewModel 上的所有对象都已清理,并且我的 DataContext = null

  1. 使用我的命令绑定(bind)的正确事件是什么?

  2. 有一种方法可以强制一个类在不再需要时自动执行方法(在我当前的过程中需要意味着)

注意:对于第二个问题,IDisposable 不起作用,因为必须手动调用。 ~ 终结器不能立即工作。

最佳答案

首先,对象没有被清理。

您尝试监听的事件的名称称为“Closing”,该事件在实际关闭之前触发。向您发出窗口完全关闭信号的事件称为“已关闭”。这是您可以参加的两个事件。

我只需在 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 分离。即使事件绑定(bind)在 View 的代码隐藏中,ViewModel 也不依赖于 View,并且可以对关闭逻辑进行单元测试。

但是,如果您坚持坚持互动,我建议您阅读下面的链接:

http://msdn.microsoft.com/en-us/library/ms748948.aspx

它将为您提供有关 Window 事件的概述。

顺便说一句,就像我已经说过的,DataContext 肯定存在,所以我假设您宁愿在命令模式中的某个地方存在错误(您可能定义了错误的命令)。您应该向我们发布完整的代码。

此外,为公共(public)命令命名时第一个字母是下划线已经过时了。我记得 20 年前在纯 C 中使用它们来表示私有(private)字段。 :)

关于c# - MVVM App,窗口关闭期间方法的确切顺序是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19624184/

相关文章:

时间:2019-04-01 标签:c#wpf mvvm pattern

c# - 扩展 WPF 第三方控件以启用对现有属性的双向绑定(bind)

c# - 如何首先使用 C# EF 代码将 Tuple<something, something> 映射到数据库?

c# - 为什么我们使用参数传递值?

c# - 输出仅取决于输入和对象状态的方法的名称是什么?

c# - MVVM WPF ListBox条目未更新

.net - 如何在 BackgroundWorker 中访问 COM 对象?

c# - 为外部集合中的每个项目断言内部集合中的元素数量

.net - 为什么我得到正方形而不是文本?

c# - 如何更新 TabControl 资源?