c#mvvm正确的事件处理

c#mvvm正确的事件处理,c#,.net,wpf,mvvm,C#,.net,Wpf,Mvvm,我已经在WPF窗口中实现了MVVM模式。我有一个子窗口,我用以下方式调用它(从另一个ViewModel): 在这里的frm\u StrediskaViewModel下,我钩住一个窗口。按以下方式关闭事件: public frm_StrediskaViewModel(ObservableCollection<DefaultStrediska> _Strediska, frm_Strediska _Window) { Window = _Window; Strediska

我已经在WPF窗口中实现了MVVM模式。我有一个子窗口,我用以下方式调用它(从另一个ViewModel):

在这里的
frm\u StrediskaViewModel
下,我钩住一个
窗口。按以下方式关闭
事件:

public frm_StrediskaViewModel(ObservableCollection<DefaultStrediska> _Strediska, frm_Strediska _Window)
{
    Window = _Window;
    Strediska = _Strediska;

    InitializeCommands();

    Window.Closing += Window_Closing;
    }

这是一种好方法,还是完全没有必要?

有一种方法可以通过整洁的绑定实现这一点,但它需要Blend SDK。为此,您需要
System.Windows.Interactivity.dll
。首先需要添加名称空间声明:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
通过此导入,您可以将命令绑定到以下事件:

<i:Interaction.Triggers>
  <i:EventTrigger EventName="Closing">
    <i:InvokeCommandAction Command="{Binding CloseCommand}" />
  </i:EventTrigger>
</i:Interaction.Triggers>

我希望这会有所帮助。

视图模型不应该通过引用来了解视图。它只能通过数据绑定与之通信。事件处理程序应该放在代码隐藏中。@poke,一般情况下事件如何:是否需要取消订阅
Dispose()
中的任何订阅事件?删除A时,对象A应该取消订阅另一个对象B的事件。但是当B被删除时,对处理程序的引用也会被垃圾收集。因此,您通常不需要取消订阅在同一类型中处理的事件,或者取消订阅生命周期较短的类型的事件。对于控件,您不会使用
Dispose
,而是使用方法。这并不能真正回答他的问题。\n问题由@poke对问题的注释回答。这个答案提供了一种根据MVVM模式处理类似情况的替代方法。
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
<i:Interaction.Triggers>
  <i:EventTrigger EventName="Closing">
    <i:InvokeCommandAction Command="{Binding CloseCommand}" />
  </i:EventTrigger>
</i:Interaction.Triggers>
public readonly ICommand CloseCommand
{
  get { return /* Your closing command here */; }
}