TabControls包含使用MVVM的不同用户控件

fhn*_*eer 3 c# wpf xaml user-controls mvvm

我正在按照MVVM制作一个WPF应用程序.在我的应用程序中我想要的是有一个视图,其中包含一些常见的按钮和文本框和一个TabControl.TabControl基本上会托管不同的UserControls.所以每个UserControl我都有一个单独ViewViewModel准备好了.

所以我的应用程序的结构看起来像这样.

MainWindow.Xaml
    EntryView.Xaml
        Button1
        Button2
        TabControl
            UserControl1 (View)
            UserControl2 (View)
            UserControl3 (View)
Run Code Online (Sandbox Code Playgroud)

我的EntryView中的儿子我有选项卡控件.现在我需要绑定它.

这就是我所做的.

EntryView.Xaml

<TabControl ItemsSource="{Binding Tabs}" SelectedItem="{Binding SelectedTab}">
    <TabControl.ContentTemplate>
        <DataTemplate DataType="{x:Type vm:UserControl1ViewModel}">
            <v:UserControl1View/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:UserControl2ViewModel}">
            <v:UserControl2View/>
        </DataTemplate>
    </TabControl.ContentTemplate>
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="Header"/>
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>
Run Code Online (Sandbox Code Playgroud)

EntryViewModel.cs

private ObservableCollection<BaseViewModel> _tabs;
public ObservableCollection<BaseViewModel> Tabs
{
    get
    {
        if (_tabs == null)
        {
            _tabs = new ObservableCollection<BaseViewModel>();
            _tabs.Add(new UserControl1ViewModel());
            _tabs.Add(new UserControl2ViewModel());
        }
        return _tabs;
    }
}
Run Code Online (Sandbox Code Playgroud)

但现在当我运行我的应用程序时,就会发生这种情况.TabControl为空.我在视图模型中将断点放在Tabs中,但它没有被击中.所以问题是我做得对吗?如果没有那么我该怎么办?

dko*_*ozl 5

对于初学者我不知道它如何在你的机器上编译,就像在我的机器上它给我这个错误:

属性"ContentTemplate"只能设置一次.

但是当我移动DataTemplatesTabControl.Resources它编译和正常工作:

<TabControl>
   <TabControl.Resources>
      <DataTemplate DataType="{x:Type vm:UserControl1ViewModel}">
         <v:UserControl1View/>
      </DataTemplate>
      <DataTemplate DataType="{x:Type vm:UserControl2ViewModel}">
         <v:UserControl2View/>
      </DataTemplate>
   </TabControl.Resources>
   <TabControl.ItemTemplate>
      <DataTemplate>
         <TextBlock Text="Header"/>
      </DataTemplate>
   </TabControl.ItemTemplate>
</TabControl>
Run Code Online (Sandbox Code Playgroud)