我试图在窗口关闭之前在虚拟机上执行一些操作,这意味着我需要 DataContext
必须可用于我的操作。
实际上我正在尝试这个:
<i:Interaction.Triggers>
<i:EventTrigger EventName="Closing">
<cmd:EventToCommand Command="{Binding _MyCleanUpCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
但是,此时我的 ViewModel
上的所有对象都已清理,并且我的 DataContext = null
使用我的命令
绑定(bind)
的正确事件
是什么?有一种方法可以强制一个类在不再需要时自动执行方法(在我当前的过程中需要意味着)?
注意:对于第二个问题,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/