[英]c# mvvm proper event disposal
我已经在WPF窗口中实现了MVVM模式。 我有一个子窗口,我通过以下方式调用它(从另一个ViewModel):
cmd_Show = new DelegateCommand(
(sender) =>
{
frm_Strediska _window = new frm_Strediska();
frm_StrediskaViewModel vm = new frm_StrediskaViewModel(ZakladneStrediska, _window);
_window.DataContext = vm;
_window.Owner = App.Current.MainWindow;
_window.ShowDialog();
});
在frm_StrediskaViewModel
下,我通过以下方式挂接到Window.Closing
事件:
public frm_StrediskaViewModel(ObservableCollection<DefaultStrediska> _Strediska, frm_Strediska _Window)
{
Window = _Window;
Strediska = _Strediska;
InitializeCommands();
Window.Closing += Window_Closing;
}
我不确定的是,当我关闭此SubWindow时,如果我的Window.Closing
事件自动解钩,还是必须重写ViewModel上的Dispose()
事件(这就是我现在正在做的事情):
protected override void Dispose(bool disposing)
{
Window.Closing -= Window_Closing;
this.Dispose();
}
这是一个好方法,还是完全没有必要?
有一种方法可以使用整洁的绑定来执行此操作,但是它需要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>
将其添加到窗口后,一旦窗口引发Closing
CloseCommand
,将执行与CloseCommand
绑定的命令。
因此,您无需自己对事件进行任何绑定。 您可以在返回命令的ViewModel中创建所需的属性。 该命令必须执行关闭期间需要执行的所有操作。 所以基本上,您当前在事件处理程序中获得了什么。
public readonly ICommand CloseCommand
{
get { return /* Your closing command here */; }
}
希望对您有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.