Панель инструментов - это 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, так же, как вы делаете это с кнопками.