TabItems会收到关闭窗口的通知

时间:2017-04-27 11:06:53

标签: c# wpf mvvm user-controls mvvm-light

假设我有一个带有几个tabitems的tabcontrol,并且实现基于this并且对this这样的每个标签使用usercontrol。还使用MVVM灯。

如何以适当的方式(mvvm)通过单击(x)来关闭应用程序关闭的tabitems以便为每个选项卡保存数据?我知道如何在MainWindow中处理一个关闭事件,该事件主持了tabitems,但我不知道如何通知每个tabitem的UserControl(实际上是它的viewmodel)。任何的想法? 此外,如果没有选择并显示在屏幕上的tabitem,将通知结束?

解决

我在这个问题的评论中遵循了@ 3615解决方案。 使用基于Mediator模式的Messenger。所以我的MainViewModel侦听窗口关闭事件并将信息广播到tabitems

3 个答案:

答案 0 :(得分:0)

前段时间我遇到了同样的问题并且我使用事件修复它,因此,当创建选项卡时,MainVM会附加到必须关闭选项卡时启动的UserControl事件,然后MainVM接收事件并关闭选项卡,因为它可以访问OpenedTabs集合。

答案 1 :(得分:0)

  

有什么想法吗?

您可以处理绑定到CollectionChanged的{​​{1}}属性的ObservableCollection<T>的{​​{1}}事件。

单击(x)按钮时,应从此集合中删除由ItemsSource表示的数据对象。

答案 2 :(得分:0)

如果您是MVVM,则选项卡具有相应的&#34;文档&#34; &#34; Main&#34;中的viewmodel。退出时,检查您的viewmodel是否脏,需要保存。从标签十字架关闭文档时,向&#34; Main&#34;发送消息。负责管理和关闭文件...

private void MetroWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        MainViewModel mvm = this.DataContext as MainViewModel;
        if ( !mvm.Close() )
            e.Cancel = true;
        else
        {
            ....
        }
    }

public MainViewModel(string param)
    {
        Messenger.Default.Register<DocumentViewModel>(this, ViewModelMessages.DocumentRequestClose,
            (DocumentViewModel o) =>
            {
                this.Documents.Remove(o);
                o.Cleanup();

                if( this.Documents.Count == 0)
                    ActiveDocument = null;
            });