WPF从多个视图模型向选项卡控件添加选项卡项

时间:2018-12-11 23:07:03

标签: c# wpf mvvm tabcontrol

在MainWindow上,有一个TabControl,其ItemSource绑定到一个ObservableCollection<TabItem>,它是视图模型(vmMainWindow)。

在主窗口上,我还有一个Menu和2个MenuItems,(相册,艺术家)

我已经为专辑和艺术家创建了PageViewModel

当单击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的经验,但是想从此继续。

1 个答案:

答案 0 :(得分:0)

您可以使用EventAggregatorMessenger类来发送其他视图模型订阅的消息。有关该概念的更多信息,请参考以下链接。

https://msdn.microsoft.com/en-us/magazine/jj694937.aspx

http://dotnetpattern.com/mvvm-light-messenger

https://blog.magnusmontin.net/2014/02/28/using-the-event-aggregator-pattern-to-communicate-between-view-models/

其他选择是要么为两个视图模型注入共享服务,要么从第二个视图模型牢牢引用第一个视图模型并引发事件。

使用事件聚合器或Messenger的好处是,您避免在事件的发布者和订阅者之间引入紧密的耦合,这会使应用程序更易于维护。事件或消息的发布者和订阅者都只了解事件聚合器或Messenger,但彼此一无所知。

顺便说一句,您不应该在视图模型中创建TabItems或任何其他可视元素。您应该创建数据对象的实例,这些实例可以由视图中的TabItems之类的可视元素表示。