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中为选项卡绑定到子视图模型。
假设您有三个视图模型: MainViewModel
, Tab1ViewModel
和Tab2ViewModel
。 在MainViewModel
,保留一组tab视图模型:
class MainViewModel { ObservableCollection
在将主窗口的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