2

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

其实我正在尝试这个:

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

但是,此时我身上的所有物体ViewModel都被清理干净了,我的DataContext = null

  1. 我的event命令Bind有什么作用?

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

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

4

2 回答 2

2

首先,物体没有被清洁。

您尝试收听的事件的名称称为“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 分离。即使事件绑定在 View 的代码隐藏中,ViewModel 也不依赖于 View,并且可以对关闭逻辑进行单元测试。

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

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

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

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

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

于 2013-10-27T23:31:06.993 回答
1

当您输入命令时,您DataContext和所有其他对象不应已被清理。Closing这不是预期的行为。

实际上,该Closing事件的主要目的是提供一种防止应用程序退出而不会造成任何伤害的方法(来自msdn):

当一个窗口关闭时,它会引发两个事件:Closing 和 Closed。关闭是在窗口关闭之前引发的,它提供了一种可以防止窗口关闭的机制。阻止窗口关闭的一个常见原因是窗口内容是否包含修改过的数据。在这种情况下,可以处理 Closing 事件以确定数据是否脏,如果是,则询问用户是继续关闭窗口而不保存数据还是取消窗口关闭。以下示例显示了处理 Closing 的关键方面。

EventTrigger在这种特定情况下,您可能有一个错误触发相关命令为时已晚。

尝试简单地将窗口绑定到Closing后面代码中的事件,看看会发生什么。

于 2013-10-27T23:38:31.290 回答