在MainWindow上,有一个TabControl
,其ItemSource
绑定到一个ObservableCollection<TabItem>
,它是视图模型(vmMainWindow)。
在主窗口上,我还有一个Menu
和2个MenuItems
,(相册,艺术家)
我已经为专辑和艺术家创建了Page
和ViewModel
。
当单击MenuItem
时,我将使用RelayCommand
创建一个Frame
来将相关的Page
绑定到其各自的视图模型。然后,我创建一个新的TabItem
,将其Content
设置为新的Frame
,然后将新的TabItem
添加到ObservableCollection<TabItem>
。
void MenuItemClick(object parameter)
{
switch (parameter)
{
case "Albums":
Frame albumsFrame = new Frame { Content = new pgAlbums { DataContext = new vmAlbums() } };
TabCollection.Add(new TabItem { Header = "Albums", Content = albumsFrame , IsSelected = true });
break;
case "Artists":
Frame artistsFrame = new Frame { Content = new pgArtists { DataContext = new vmArtists() } };
TabCollection.Add(new TabItem { Header = "Artists", Content = artistsFrame , IsSelected = true });
break;
}
}
我想做的是能够以与其他ObservableCollection<TabItem>
的视图模型相同的方式将标签添加到Page
,但是我无法从其中访问TabCollection 。我要么需要全局放置它,要么以某种方式在视图模型之间共享它。
我知道我会以错误的方式进行操作,因此我将其放在此处,以便有人可以指导我正确地做事。我是MVVM的新手,我只有Winforms的经验,但是想从此继续。
答案 0 :(得分:0)
您可以使用EventAggregator
或Messenger
类来发送其他视图模型订阅的消息。有关该概念的更多信息,请参考以下链接。
https://msdn.microsoft.com/en-us/magazine/jj694937.aspx
http://dotnetpattern.com/mvvm-light-messenger
其他选择是要么为两个视图模型注入共享服务,要么从第二个视图模型牢牢引用第一个视图模型并引发事件。
使用事件聚合器或Messenger的好处是,您避免在事件的发布者和订阅者之间引入紧密的耦合,这会使应用程序更易于维护。事件或消息的发布者和订阅者都只了解事件聚合器或Messenger,但彼此一无所知。
顺便说一句,您不应该在视图模型中创建TabItems
或任何其他可视元素。您应该创建数据对象的实例,这些实例可以由视图中的TabItems
之类的可视元素表示。