Как использовать ControlTemplate и DataTemplate для указания TabItem - PullRequest
0 голосов
/ 27 марта 2009

Мне нужно использовать ControlTemplate и DataTemplate одновременно - я думаю.

У меня есть TabControl, чьи TabItems предоставляются ObservableCollection - я могу создавать элементы ObservableCollection в любом случае по своему выбору.

TabItems нужно использовать ControlTemplate, потому что они имеют выбранное, невыбранное и отключенное состояние, поэтому им нужно иметь триггеры событий для переключения состояний - на выбранной вкладке есть кнопка оранжевого стекла, а на невыбранных вкладках есть синяя стеклянная кнопка. Каждая вкладка должна иметь значок (изображение), который находится внутри соответствующей стеклянной кнопки, а также метку вкладки, которая отличается для каждой вкладки и которая предоставляется ObservableCollection.

Если я правильно понимаю, можно использовать либо ControlTemplate, либо DataTemplate, но не оба на одном и том же уровне визуального дерева.

Единственное потенциальное решение, о котором я могу подумать, - это определить один ContentPresenter в шаблоне TabItem ControlTemplate - ContentPresenter (с изображением и меткой) будет определен DataTemplate, который получит данные из ObservableCollection.

Будем благодарны за любые указания, предложения и / или исправления в моем понимании.

Ответы [ 2 ]

0 голосов
/ 17 июля 2009

Для этого есть два шага.

В элементе управления вкладкой вы можете использовать ItemContainerStyle <- который используется даже внутри списка и элемента управления, где вы можете указать «окружающий» пользовательский интерфейс вокруг вашего «ContentPresenter», который может предоставить вам средство привязки состояния, например, включен, выбран и т. Д. </p>

И вы также можете продолжать использовать DataTemplate. Ваш шаблон данных будет отображен в ContentPresenter стиля контейнера элементов.

0 голосов
/ 14 июля 2009

Не могли бы вы быть более конкретным, какое поведение вы хотите достичь? Как правило, вы можете стилизовать заголовок вкладки и содержимое вкладки по отдельности и оба на основе привязанного элемента данных. Как вы можете легко вывести, шаблон элемента описывает заголовок, а шаблон - его содержимое. Пример ниже показывает, как: (включая

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:sys="clr-namespace:System;assembly=mscorlib" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

в соседней странице / окне)

<Grid>
  <Grid.Resources>
     <x:Array x:Key="data" Type="{x:Type sys:Type}">
        <x:Type TypeName="Visual"/>
        <x:Type TypeName="UIElement"/>
        <x:Type TypeName="FrameworkElement"/>
     </x:Array>
  </Grid.Resources>
  <TabControl ItemsSource="{StaticResource data}">
     <TabControl.ItemTemplate>
        <DataTemplate>
           <TextBlock Text="{Binding Name}">
              <TextBlock.Style>
                 <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="Background" Value="DimGray"/>
                    <Setter Property="Foreground" Value="White"/>
                 </Style>
              </TextBlock.Style>
           </TextBlock>
        </DataTemplate>
     </TabControl.ItemTemplate>
     <TabControl.ContentTemplate>
        <DataTemplate>
           <TextBlock Text="{Binding FullName}">
           <TextBlock.Style>
              <Style TargetType="{x:Type TextBlock}">
                 <Setter Property="Background" Value="LightCoral"/>
                 <Setter Property="Foreground" Value="Navy"/>
              </Style>
              </TextBlock.Style>
           </TextBlock>
        </DataTemplate>
     </TabControl.ContentTemplate>
  </TabControl>
</Grid>
...