在TabControl中使用usercontrols模板进行网格化

时间:2017-10-20 13:07:51

标签: c# wpf

我是WPF的新手并尝试学习VMMV。我尝试使用模板为xaml中的内容创建TabControl。 我想要tabitem包含网格内容和用户控件的网格列表。添加用户控件后,tabitem的标题呈现正确,但内容中没有任何内容。有什么问题?

这是我的xaml:

<TabControl ItemsSource="{Binding Items}" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" Visibility="Hidden" Name="tcContent" Grid.Column="1" Grid.Row="0">
   <TabControl.ItemTemplate>
      <DataTemplate>
         <TextBlock Text="{Binding Header}" />
      </DataTemplate>
   </TabControl.ItemTemplate>
   <TabControl.ContentTemplate>
      <DataTemplate>
         <ContentControl Content="{Binding Content}" />
      </DataTemplate>
   </TabControl.ContentTemplate>
</TabControl>

视图模型:

public class Tab
{
    public string Header { get; set; }
    public ObservableCollection<UserControl> Content { get; set; }
}

public class MainWindowsViewModel
{        
    ObservableCollection<Tab> _items = new ObservableCollection<Tab>();

    public ObservableCollection<Tab> Items
    {
         get
         {
              return _items;
         }
    }       
}

填写tabcontrol的代码背后:

public MainWindow()
{ 
     this.DataContext = new MainWindowsViewModel();
}

public void AddToTab(string header, UserControl c)
{
     Tab tab = new Tab();
     tab.Header = header;
     tab.Content = new ObservableCollection<UserControl>();
     tab.Content.Add(c);

     ((MainWindowsViewModel)this.DataContext).Items.Add(tab);
}

2 个答案:

答案 0 :(得分:3)

您误解了MVVM原则。

在视图模型中,您拥有Tab个对象的集合,每个对象都包含UserControl个集合。通过这种方式,您的视图模型包含一些视图元素(UserControl s)。在MVVM中,你不应该这样做。

相反,您为每个标签项创建视图模型,用于描述表示模型(因此视图 - 模型);在XAML中,您描述了这些视图模型应该如何使用DataTemplate

但只有在您的观点必须是动态的时候才需要这一切。例如。你不知道哪些数据可用,因为你是从数据库中提取它们的。

如果您的TabItem显示一组不会改变的UserControl,那么只需在XAML中完整描述您的视图,而不需要DataTemplate

答案 1 :(得分:2)

首先,从Visibility="Hidden"中移除TabControl。然后将ControlControl更改为ItemsControl,其中包含Tab.Content,这是一个集合。但是,你应该注意@dymanoid的回答中提到的问题。

<TabControl.ContentTemplate>
    <DataTemplate >
        <ItemsControl ItemsSource="{Binding Content}" />
    </DataTemplate>
</TabControl.ContentTemplate>