WPF MVVM:将不同的ViewModel绑定到每个TabItem?

我有一个主窗口,其中包含一个包含2个tabItem的选项卡控件:

主窗口

我目前有一个ViewModel ,它为Tab1和Tab2提供服务。 这个ViewModel变得有点臃肿,SOC模糊。 我想将逻辑拆分为2个视图模型:ViewModel 1和ViewModel2。 我的理解是你可以将主窗口DataContext设置为一个包含ViewModel集合的Base ViewModel,然后你可以将每个TabItem断言为另一个ViewModel。

我见过的这些基本ViewModel示例公开了一个ObservableCOllection,如下所示:

 private ObservableCollection _viewModelCollection Public Observable Collection ViewModelCollection { get { return _viewModelCollection; } set { _viewModelCollection = value; OnPropertyChanged("ViewModelCollection"); } } public BaseViewModel() { ViewModelCollection = new ObservableCollection(); ViewModelCollection.Add(new ViewModel1(Tab1); ViewModelCollection.Add(new ViewModel1(Tab2); } 

但是如何为每个TabItem分配不同的ViewModel? 我想要Tab1 = ViewModel1&Tab2 = ViewModel2?

您确实可以将选项卡的视图模型添加到主视图模型中。 然后,您可以在XAML中为选项卡绑定到子视图模型。

假设您有三个视图模型: MainViewModelTab1ViewModelTab2ViewModel 。 在MainViewModel ,保留一组tab视图模型:

 class MainViewModel { ObservableCollection _children; public MainViewModel() { _children = new ObservableCollection(); _children.Add(new Tab1ViewModel()); _children.Add(new Tab2ViewModel()); } public ObservableCollection Children { get { return _children; } } } 

在将主窗口的DataContext设置为MainViewModel您可以通过引用Children属性来绑定选项卡的DataContext

         

我使用像Prism这样的框架,它允许您定义区域并使用RegionManager 。 然后,您可以将ContentControl定义为TabItem的“ui”

然后,您可以使用RegionManager.RequestNavigate来填充具有特定视图的命名区域(我们的视图会导入视图模型并设置其datacontext)。

 class MainViewModel { ObservableCollection _children; public MainViewModel() { _children = new ObservableCollection(); _children.Add(new Tab1ViewModel()); _children.Add(new Tab2ViewModel()); } public ObservableCollection Children { get { return _children; } } } 

现在在XAML中将Children绑定到ItemsSource。 它将为我们添加到observable集合中的每个视图模型生成每个Tab