Разделитель через DataTemplate - PullRequest
2 голосов
/ 28 марта 2011

У меня есть ToolBar с привязкой ItemsSource, я использую DataTemplateSelector для определения DataTemplate во время выполнения (т. Е. Button / ToggleButton).

Я хочудобавить Separator DataTemplate, как мне это сделать?

1 Ответ

3 голосов
/ 29 марта 2011

Панель инструментов - это ItemsControl, поэтому она хочет «обернуть» элементы, определенные в Items / ItemsSource, «контейнером».Контейнер - это UIElement, который можно использовать для отображения элемента.Например, в случае ListBox контейнером является ListBoxItem.Если элемент имеет правильный тип, то это также может быть его собственный контейнер.

Эта настройка позволяет передавать список строк в ListBox и позволяет ему отображать свойства и поддерживать выбор, навигацию с помощью клавиатуры, стилизациюи т. д.

В случае панели инструментов он действительно ожидает, что его элементы уже являются контейнером (т. е. UIElement).Если элемент не является элементом UIElement, он будет обернут в него ContentPresenter.

Теперь контейнер DataTemplateSelecter используется для определения способа отображения своего элемента.Но вам нужно, чтобы этот элемент был Button, ToggleButton, Separator и т. Д. Вы предлагаете добавить контейнер в шаблон данных, отображаемый контейнером.

Существует также проблема стилей, которая может бытьв этом простом примере:

<Window x:Class="TestWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:system="clr-namespace:System;assembly=mscorlib" Title="Main"
        Height="500" Width="500">
    <DockPanel LastChildFill="False">
        <ToolBar DockPanel.Dock="Top">
            <ToolBar.ItemTemplate>
                <DataTemplate>
                    <Button Content="{Binding}" />
                </DataTemplate>
            </ToolBar.ItemTemplate>
            <system:String>Test1</system:String>
            <system:String>Test2</system:String>
        </ToolBar>
        <ToolBar DockPanel.Dock="Top">
            <Button>Test1</Button>
            <Button>Test2</Button>
        </ToolBar>
    </DockPanel>
</Window>

Кнопки в верхней панели инструментов будут отображаться так же, как если бы их не было в панели инструментов.Кнопки на панели инструментов внизу получат вид «панели инструментов».То же самое относится и к разделителям.

Вы можете вручную применить стиль следующим образом:

<Window x:Class="TestWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:system="clr-namespace:System;assembly=mscorlib" Title="Main"
        Height="500" Width="500">
    <DockPanel LastChildFill="False">
        <ToolBar DockPanel.Dock="Top">
            <ToolBar.ItemTemplate>
                <DataTemplate>
                    <Button Content="{Binding}"
                        Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" /> <!-- Add the Style attribute -->
                </DataTemplate>
            </ToolBar.ItemTemplate>
            <system:String>Test1</system:String>
            <system:String>Test2</system:String>
        </ToolBar>
        <ToolBar DockPanel.Dock="Top">
            <Button>Test1</Button>
            <Button>Test2</Button>
        </ToolBar>
    </DockPanel>
</Window>

У вас будет такая же проблема с разделителями.Поэтому вам нужно будет вручную применить стиль следующим образом:

<DataTemplate x:Key="MySeparatorTemplate">
    <Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" />
</DataTemplate>

Вы должны иметь возможность использовать приведенный выше DataTemplate в DataTemplateSelector, так же, как вы делаете это с кнопками.

...