WPF:将多个视图绑定到TabControl';s项目

WPF:将多个视图绑定到TabControl';s项目,wpf,data-binding,tabcontrol,Wpf,Data Binding,Tabcontrol,在当前的项目中,我们有一个主窗口,其中包含多个视图(每个视图都有自己的viewmodel),这些视图在选项卡控件中显示为项。例如:一个选项卡项是编辑器,包含编辑器视图,如下所示: <TabItem Header="Test Editor"> <TestEditor:TestEditorView DataContext="{Binding TestEditorViewModel}"/> </TabItem> 另一个显示结果: <

在当前的项目中,我们有一个主窗口,其中包含多个视图(每个视图都有自己的viewmodel),这些视图在选项卡控件中显示为项。例如:一个选项卡项是编辑器,包含编辑器视图,如下所示:

<TabItem Header="Test Editor">
            <TestEditor:TestEditorView DataContext="{Binding TestEditorViewModel}"/>
</TabItem>

另一个显示结果:

<TabItem Header="Results Viewer">
     <ResultViewer:ResultViewer x:Name="resultViewer1" DataContext="{Binding Path=ResultViewModel}"  />
</TabItem>

等等
我希望将TabItems绑定到主窗口的viewmodel中的某个对象,但我不知道如何在不破坏MVVM模式的情况下将视图的名称绑定到任何属性。我想要一些像:

 <TabControl.ContentTemplate>
     <DataTemplate>
         <TestEditor:TestEditorView DataContext ="{Binding TabDataContext}"/>
     </DataTemplate>
 </TabControl.ContentTemplate>

仅使用一些绑定,而不必在设计时知道将使用什么类型作为内容。

有什么想法吗?

通常我会将选项卡控件的选项卡存储在
ViewModel
中,以及
SelectedIndex
,然后我使用
DataTemplates
来确定要显示的
视图

视图:


视图模型:

public class MyViewModel : ViewModelBase
{

    publicMyViewModel()
    {
        TabCollection.Add(new ResultsViewModel());
        TabCollection.Add(new EditorViewModel());
        SelectedTabIndex = 0;
    }

    private ObservableCollection<ViewModelBase> _tabCollection
        = new ObservableCollection<ViewModelBase>();

    public ObservableCollection<ViewModelBase> TabCollection
    {
        get { return _tabCollection };
    }

    private int _selectedTabIndex;
    public int SelectedTabIndex
    {
        get { return _selectedTabIndex; }
        set
        {
            if (value != _selectedTabIndex)
            {
                _selectedTabIndex = value;
                RaisePropertyChanged("SelectedTabIndex");
            }
        }
    }
}
公共类MyViewModel:ViewModelBase { publicMyViewModel() { TabCollection.Add(新结果视图模型()); TabCollection.Add(新的EditorViewModel()); SelectedTabIndex=0; } 私有可观察集合\u tab集合 =新的ObservableCollection(); 公共可见集合选项卡集合 { 获取{return}tabCollection}; } 私有int_选择的TABINDEX; 公共int-SelectedTabIndex { 获取{return\u selectedTabIndex;} 设置 { 如果(值!=\u选择的数据索引) { _selectedTabIndex=值; RaisePropertyChanged(“SelectedTabIndex”); } } } }
我还想使用TabItem的一个子类,这可以通过您的解决方案来完成吗(除此之外看起来还不错)?谢谢。你用这个小班做什么?它与视图相关还是与视图模型相关?不管是哪种情况,我相信它都可能与最初的问题有某种关联,但这个答案帮助我解决了一个问题。在定义数据模板时,不要忘记{x:Type viewmodel…},这一点非常重要。我没有x:Type前缀,这让我发疯。谢谢这将显示空的选项卡标题。这可以通过向ViewModelBase添加字符串头属性或创建像ITabItem这样的接口来解决,该接口实现了头属性。让每个选项卡viewmodel实现这一点,并将其绑定到视图中的标题。然后将TabCollection设置为类型而不是。一些重构技巧:删除\ tab集合。这里不需要它。删除所选的选项卡。只需在xaml中设置SelectedIndex=0。还是投票,因为它给了我正确的方向。
public class MyViewModel : ViewModelBase
{

    publicMyViewModel()
    {
        TabCollection.Add(new ResultsViewModel());
        TabCollection.Add(new EditorViewModel());
        SelectedTabIndex = 0;
    }

    private ObservableCollection<ViewModelBase> _tabCollection
        = new ObservableCollection<ViewModelBase>();

    public ObservableCollection<ViewModelBase> TabCollection
    {
        get { return _tabCollection };
    }

    private int _selectedTabIndex;
    public int SelectedTabIndex
    {
        get { return _selectedTabIndex; }
        set
        {
            if (value != _selectedTabIndex)
            {
                _selectedTabIndex = value;
                RaisePropertyChanged("SelectedTabIndex");
            }
        }
    }
}