我在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();
}
这是一个好方法,还是完全没必要?
答案 0 :(得分:1)
有一种方法可以使用整洁的绑定,但它需要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>
在窗口引发CloseCommand
- 事件后,将其添加到窗口将导致与Closing
绑定的命令执行。
因此您不需要自己对事件进行任何绑定。您可以在ViewModel中创建返回命令的必需属性。此命令必须执行关闭期间所需的操作。所以基本上你现在在你的事件处理程序中得到了什么。
public readonly ICommand CloseCommand
{
get { return /* Your closing command here */; }
}
我希望有所帮助。