Подтвердить что ты не робот

TabControl.ItemTemplate: установите TabItem.Header.Text в MultiBinding с помощью StringFormat

Как настроить TabItem.Header на привязки, взятые из нескольких полей, каждая привязка, показанная в другом размере, вместо исходного текста заголовка; без переопределения стиля по умолчанию и поведения заголовка - мне нужен только текст.

Я попытался установить его шаблон, но затем он создает прямоугольник, содержащий внутренние элементы управления, и этот прямоугольник не реагирует на пользовательские клики, а также имеет стиль управления, я хочу, чтобы эти элементы управления были невидимыми, только его текст должны быть видны.

Я пробовал следующее:

<TabControl ItemsSource="{Binding}">
    <TabControl.ItemTemplate>
         <DataTemplate>
             <TabItem>
                 <TabItem.Header>
                     <MultiBinding StringFormat="{}{0}-{1}">
                         <Binding Path="Title"/>
                         <Binding Path="Category.Title"/>
                     </MultiBinding>
                 </TabItem.Header>
                 <TabItem.Content>
                     <TextBlock>
                         Here is what is gonna be in the TabItem - not header
                     </TextBlock>
                 </TabItem.Content>
             </TabItem>
         </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>

Но это ничего не показывает.

Я также пытался установить HeaderTemplate в DataTemplate, но происходит то, что DataTemplate переопределяет стиль TabItem, и когда я нажимаю текст, он не переходит на вкладку с щелчком, кроме того, невыбранные вкладки выглядят очень забавными, Я вижу прямоугольник текста, плавающий, а я хочу, чтобы он был прозрачным.

Итак, чтобы обобщить мой вопрос, я хочу установить TabItem.Header.Text в MultiBinding с StringFormat.

4b9b3361

Ответ 1

TabControl содержит свойство ContentTemplate, а также ItemTemplate, которое он наследует от ItemsControl. Он использует ContentTemplate, чтобы отличать то, что отображается в области содержимого, в то время как ItemTemplate определяет шаблон для заголовка. Кроме того, каждый элемент из вашего ItemSource будет автоматически обернут в TabItem; он не нуждается в повторном создании в ItemTemplate, поскольку это попытается поместить TabItem внутри заголовка, как вы заметили.

Вместо повторного создания TabItem внутри ItemTemplate используйте ItemTemplate для определения содержимого заголовка и ContentTemplate для определения вашего содержимого.

<TabControl ItemsSource="{Binding}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <TextBlock.Text>
                    <MultiBinding StringFormat="{}{0}--{1}">
                        <Binding Path="Title" />
                        <Binding Path="Category.Title" />
                    </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding MyContent}" />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

В вашем первом абзаце вы упомянули, что хотите установить разные размеры в связанных частях заголовка. Если вы хотите это сделать, вы не сможете использовать один Binding или MultiBinding, чтобы установить текст так, как это сделано выше. Вместо этого вы можете вставлять TextBlocks для достижения этого с различным форматированием для каждого.

<TabControl.ItemTemplate>
    <DataTemplate>
        <TextBlock>
            <TextBlock Text="{Binding Title}"
                       FontSize="12" />
            <Run Text="--" />
            <TextBlock Text="{Binding Category.Title}"
                       FontSize="10" />
        </TextBlock>
    </DataTemplate>
</TabControl.ItemTemplate>