我在SO上搜索了很久,但没有找到解决我的问题的答案。我想在MVVM中使用TabControl。这是我如何将TabControl添加到MainWindow.xaml:
<Window.Resources>
<DataTemplate DataType="{x:Type models:PartnersViewModel}">
<views:PartnersView />
</DataTemplate>
<DataTemplate DataType="{x:Type models:ProjectsViewModel}">
<views:ProjectsView />
</DataTemplate>
</Window.Resources>
<Window.DataContext>
<models:ApplicationViewModel/>
</Window.DataContext>
<TabControl ItemsSource="{Binding PageViewModels}" TabStripPlacement="Left">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<ContentControl Content="{Binding}" />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
PageViewModels是ObservableCollection<IPageViewModel>
。
IPageViewModel
是一个简单的接口,只有一个Name
属性。有两个这个接口的实现:PartnersViewModel
和ProjectsViewModel
。
public class ProjectsViewModel : IPageViewModel
{
public String Name
{
get { return "Projects"; }
}
}
public class PartnersViewModel : IPageViewModel
{
public String Name
{
get { return "Partners"; }
}
}
我希望每个选项卡都显示为ContentControl。标题文本取自Name属性。我的ProjectsView和PartnersView如下所示:
<UserControl x:Class="WANIRPartners.Views.ProjectsView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" >
<Grid>
<Label Content="Projects Content" />
</Grid>
</UserControl>
使用此代码,选项卡的标题和内容完全相同。
'Projects Content' / 'Partners Content'
显示在选项卡标题中,也(这没问题)显示在选项卡内容中。当我将<Label/>
更改为<DataGrid/>
时,选项卡标题包含数据网格(非常奇怪!)。
如何使其正常工作?我的意思是如何将选项卡标题显示为属性Name
的值,并根据PageViewModels
中的内容正确呈现选项卡内容,即<views: PartnersView />
或<views: ProjectsView />
。请帮忙修改。
TabControl
的模板(它的外观),或者你使用了类似于MahApps或默认外观的东西。显式的ItemTemplate
应该优先于隐式的DataType
模板。 - dkozl