c#mvvm适当的事件处理

时间:2015-08-20 09:10:13

标签: c# .net wpf mvvm

我在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();
}

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

1 个答案:

答案 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 */; }
}

我希望有所帮助。