繁体   English   中英

c#mvvm适当的事件处理

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM