c#mvvm正确的事件处理
我已经在WPF窗口中实现了MVVM模式。我有一个子窗口,我用以下方式调用它(从另一个ViewModel): 在这里的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
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 */; }
}