我是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);
}
答案 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>