Как я могу использовать пользовательский элемент управления TabItem при привязке данных к TabControl в WPF? - PullRequest
4 голосов
/ 01 июня 2009

У меня есть пользовательский элемент управления, полученный из TabItem, и я хочу связать эту пользовательскую TabItem с акцией TabControl. Я бы предпочел не создавать новый TabControl только для этого редкого случая.

Это то, что у меня есть, и мне не повезло получить правильный контроль для загрузки. В этом случае я хочу использовать мой ClosableTabItem элемент управления вместо стандартного TabItem элемента управления.

<TabControl x:Name="tabCases" IsSynchronizedWithCurrentItem="True" 
            Controls:ClosableTabItem.TabClose="TabClosed" >
    <TabControl.ItemTemplate>
        <DataTemplate DataType="{x:Type Controls:ClosableTabItem}" >
            <TextBlock Text="{Binding Path=Id}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate DataType="{x:Type Entities:Case}">
            <CallLog:CaseReadOnlyDisplay DataContext="{Binding}" />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

РЕДАКТИРОВАТЬ: Это то, что я закончил, а не пытаться привязать пользовательский элемент управления. " CloseCommand ", который я получаю от предыдущего вопроса .

    <Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}" >
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TabItem}">
                    <Border 
                            Name="Border"
                            Background="LightGray"
                            BorderBrush="Black" 
                            BorderThickness="1" 
                            CornerRadius="25,0,0,0"
                            SnapsToDevicePixels="True">
                        <StackPanel Orientation="Horizontal">
                        <ContentPresenter x:Name="ContentSite"
                              VerticalAlignment="Center"
                              HorizontalAlignment="Center"
                              ContentSource="Header"
                              Margin="20,1,5,1"/>
                            <Button 
                                Command="{Binding Path=CloseCommand}"
                                Cursor="Hand"
                                DockPanel.Dock="Right"
                                Focusable="False"
                                Margin="1,1,5,1"
                                Background="Transparent"
                                BorderThickness="0">
                                <Image Source="/Russound.Windows;component/Resources/Delete.png" Height="10" />
                            </Button>
                        </StackPanel>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="FontWeight" Value="Bold" />
                            <Setter TargetName="Border" Property="Background" Value="LightBlue" />                            
                            <Setter TargetName="Border" Property="BorderThickness" Value="1,1,1,0" />
                            <Setter TargetName="Border" Property="BorderBrush" Value="DarkBlue" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Ответы [ 2 ]

7 голосов
/ 09 мая 2010

нашел способ, наследовать класс от TabControl и переопределять эту функцию, в моем случае я хочу, чтобы элементы элемента управления вкладкой (при привязке) были CloseableTabItems

public class CloseableTabControl : TabControl
    {
        protected override DependencyObject GetContainerForItemOverride()
        {
            return new CloseableTabItem();
        }
    }

HTH Кто-то

Sam

1 голос
/ 01 июня 2009

Вы не хотите устанавливать DataType из DataTemplate в этом случае. Значение свойства ItemTemplate используется всякий раз, когда требуется добавить новый элемент, а в случае элемента управления с вкладками оно будет использоваться для создания нового TabItem. Вы должны объявить экземпляр вашего класса внутри самого DataTemplate:

<TabControl x:Name="tabCases" IsSynchronizedWithCurrentItem="True" Controls:ClosableTabItem.TabClose="TabClosed">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <Controls:ClosableTabItem>
                <TextBlock Text="{Binding Path=Id}" />
            </Controls:ClosableTabItem>
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate DataType="{x:Type Entities:Case}">
            <CallLog:CaseReadOnlyDisplay DataContext="{Binding}" />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

Это приведет к созданию нового ClosableTabItem при каждом добавлении новой вкладки в TabControl.

Обновление ; Из вашего комментария звучит так, что ItemTemplate контролирует то, что создается внутри TabItem, а не изменяет сам TabItem. Чтобы сделать то, что вы хотите сделать, но для TreeView вы должны установить HeaderTemplate. К сожалению, я не вижу HeaderTemplate свойства TabControl.

Я провел некоторый поиск, и в этом руководстве изменяет содержимое заголовков вкладок, добавляя элементы управления к TabItem.Header. Может быть, вы могли бы создать Style для вашего TabItems, который бы добавил кнопку закрытия, которую ваш класс добавляет в настоящее время?

...