2015-04-19 5 views
3

Я много искал на 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.

+0

Правильно ли я понимаю, что он правильно выбрал 'DataTemplate' для' DataType', но затем игнорирует 'ItemTemplate' для заголовка? У шаблона «TabControl» есть шаблон по умолчанию? – dkozl

+0

Кажется, вы правы. DataTemplate правильно выбран, но ItemTemplate игнорируется. Что вы подразумеваете по шаблону по умолчанию для TabControl? Извините, я только начинаю с WPF. – sop3k

+0

Я имею в виду, что XAML, который вы показали, должен работать и работает на моем конце. Я не вижу ничего очевидного в этом, так что в моем вопросе вы меняете шаблон «TabControl» (как он выглядит), вы используете что-то вроде MahApps или по умолчанию. Явный 'ItemTempate' должен иметь приоритет над неявным шаблоном' DataType' – dkozl

ответ

1

ваш код должен работать, не имеет аттенюатора IDE. вы также можете использовать Snoop для проверки привязок во время выполнения. я изменил ContentTemplate на:

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

и он работает. но даже ваш код работает в моем testapp.

0

Я нашел решение для Elysium. Добавление fter добавления кода ниже, все работает нормально.

<TabControl.Resources> 
    <Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}"> 
     <Setter Property="Header" Value="{Binding Name}"/> 
    </Style> 
</TabControl.Resources> 
Смежные вопросы