假设我有一个带有几个tabitems的tabcontrol,并且实现基于this并且对this这样的每个标签使用usercontrol。还使用MVVM灯。
如何以适当的方式(mvvm)通过单击(x)来关闭应用程序关闭的tabitems以便为每个选项卡保存数据?我知道如何在MainWindow中处理一个关闭事件,该事件主持了tabitems,但我不知道如何通知每个tabitem的UserControl(实际上是它的viewmodel)。任何的想法? 此外,如果没有选择并显示在屏幕上的tabitem,将通知结束?
我在这个问题的评论中遵循了@ 3615解决方案。 使用基于Mediator模式的Messenger。所以我的MainViewModel侦听窗口关闭事件并将信息广播到tabitems 。
答案 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;
});