Я много искал на SO и не нашел ответа на мои проблемы. Я хочу использовать TabControl с MVVM. Вот как я добавить TabControl к MainWindow.xamlWPF TabControl с ContentControl
<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
. Существует 2 реализации этого интерфейса 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>
Используя этот код, заголовок и содержание в TabControl
точно так же. Содержимое «Контент»/«Содержимое партнеров» отображается в заголовках табулатур, а также (это нормально) в содержимом вкладок. Когда я меняю <Label/>
на <DataGrid/>
вкладки заголовков содержат datagrid (sic!). Как я могу заставить это работать правильно. Я имею в виду, как я могу отображать заголовки как значение свойства Name
и содержимое вкладки как правильно отображаемое <views:PartnersView />
или <views:ProjectsView />
в зависимости от того, что находится в PageViewModels
.
Правильно ли я понимаю, что он правильно выбрал 'DataTemplate' для' DataType', но затем игнорирует 'ItemTemplate' для заголовка? У шаблона «TabControl» есть шаблон по умолчанию? – dkozl
Кажется, вы правы. DataTemplate правильно выбран, но ItemTemplate игнорируется. Что вы подразумеваете по шаблону по умолчанию для TabControl? Извините, я только начинаю с WPF. – sop3k
Я имею в виду, что XAML, который вы показали, должен работать и работает на моем конце. Я не вижу ничего очевидного в этом, так что в моем вопросе вы меняете шаблон «TabControl» (как он выглядит), вы используете что-то вроде MahApps или по умолчанию. Явный 'ItemTempate' должен иметь приоритет над неявным шаблоном' DataType' – dkozl