WPF:将多个视图绑定到 TabControl 的项目

Noi*_*ich 2 data-binding wpf tabcontrol

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

<TabItem Header="Test Editor">
            <TestEditor:TestEditorView DataContext="{Binding TestEditorViewModel}"/>
</TabItem>
Run Code Online (Sandbox Code Playgroud)

另一个显示结果:

<TabItem Header="Results Viewer">
     <ResultViewer:ResultViewer x:Name="resultViewer1" DataContext="{Binding Path=ResultViewModel}"  />
</TabItem>
Run Code Online (Sandbox Code Playgroud)

等等。
我想将 TabItems 绑定到主窗口视图模型中的某些内容,但我不知道如何在不破坏 MVVM 模式的情况下将视图的名称绑定到任何属性。我想要一些类似的东西:

 <TabControl.ContentTemplate>
     <DataTemplate>
         <TestEditor:TestEditorView DataContext ="{Binding TabDataContext}"/>
     </DataTemplate>
 </TabControl.ContentTemplate>
Run Code Online (Sandbox Code Playgroud)

只需要一些绑定,而不必在设计时知道什么类型将用作内容。
有任何想法吗?

Rac*_*hel 5

通常我将 TabControl 的 Tabs 存储在ViewModel, 以及SelectedIndex, 然后我DataTemplates用来确定View要显示的

看法:

<Window>
    <Window.Resources>
        <DataTemplate DataType="{x:Type ResultViewModel}">
            <ResultViewer:ResultViewer />
        </DataTemplate>
        <DataTemplate DataType="{x:Type EditorViewModel}">
            <TestEditor:TestEditorView />
        </DataTemplate>
    </Window.Resources>

    <TabControl ItemsSource="{Binding TabCollection}"
                SelectedIndex="{Binding SelectedTabIndex}" />

</Window>
Run Code Online (Sandbox Code Playgroud)

视图模型:

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");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)