Пример:
<ComboBox Name="cb" Grid.IsSharedSizeScope="True" ItemsSource="{DynamicResource items}">
<ComboBox.Resources>
<CompositeCollection x:Key="items">
<ComboBoxItem IsEnabled="False">
<Grid TextElement.FontWeight="Bold">
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="A"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition SharedSizeGroup="B"/>
</Grid.ColumnDefinitions>
<Grid.Children>
<TextBlock Grid.Column="0" Text="Name"/>
<TextBlock Grid.Column="2" Text="Occupation"/>
</Grid.Children>
</Grid>
</ComboBoxItem>
<Separator/>
<CollectionContainer Collection="{Binding Source={x:Reference cb}, Path=DataContext.Data}"/>
</CompositeCollection>
<DataTemplate DataType="{x:Type obj:Employee}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="A"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition SharedSizeGroup="B"/>
</Grid.ColumnDefinitions>
<Grid.Children>
<TextBlock Grid.Column="0" Text="{Binding Name}"/>
<TextBlock Grid.Column="2" Text="{Binding Occupation}"/>
</Grid.Children>
</Grid>
</DataTemplate>
</ComboBox.Resources>
</ComboBox>
Обратите внимание, что получить право на связывание Collection
не так просто, потому что нет ни DataContext
, ни VisualTree, на которые можно положиться, ElementName
и RelativeSource
этого не делаютЭто связано с тем, что CompositeCollection
- это просто коллекция, а не FrameworkElement.
Кроме того, это выполняется с помощью гридов, имеющих столбцы общего размера.DataTemplate применяется автоматически с помощью DataType
.
Редактировать: Недостаточно установить свойство IsHitTestVisible
для header-ComboBoxItem в False
так как он все еще может быть выбран с помощью клавиатуры.Теперь я изменил его на IsEnabled="False"
, что немного затухает.Вы могли бы, вероятно, изменить шаблон этого элемента, чтобы не делать этого.Или если вы найдете другой способ отключить его от выбора, который, конечно, тоже сработает.