Я хочу отобразить пользовательский шаблон/объект как выбранный пункт в ComboBox (этот объект на самом деле не существует в списке объектов и обновляется по-другому). Это даже не делает потребностей быть объектом, просто обеспечивание пользовательского представления работало бы.
Как я могу сделать это при пребывании в текущей теме ComboBox (так никакая возможная замена ControlTemplate)? Насколько я вижу, все SelectionBox*, свойства не доступны для редактирования, и внутренне ComboBox использует ContentPresenter без имени.
Я бы сделал это так:
<Window.Resources>
<DataTemplate x:Key="NormalItemTemplate" ...>
...
</DataTemplate>
<DataTemplate x:Key="SelectionBoxTemplate" ...>
...
</DataTemplate>
<DataTemplate x:Key="CombinedTemplate">
<ContentPresenter x:Name="Presenter"
Content="{Binding}"
ContentTemplate="{StaticResource NormalItemTemplate}" />
<DataTemplate.Triggers>
<DataTrigger
Binding="{Binding RelativeSource={RelativeSource FindAncestor,ComboBoxItem,1}}"
Value="{x:Null}">
<Setter TargetName="Presenter" Property="ContentTemplate"
Value="{StaticResource SelectionBoxTemplate}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Window.Resources>
...
<ComboBox
ItemTemplate="{StaticResource CombinedTemplate}"
ItemsSource="..."
... />
Причина, по которой это работает, заключается в том, что CombinedTemplate
обычно просто использует NormalItemTemplate для представления своих данных, но если нет ComboBoxItem
Предполагается, что предок находится в поле выбора, поэтому он использует SelectionBoxTemplate.
Обратите внимание, что три DataTemplate
могут быть включены в любой уровень ResourceDictionary
(не только на уровне Window
) или даже непосредственно в ComboBox
, в зависимости от ваших предпочтений.
Вам необходимо изучить Триггеры и Стили . Вы также можете изучить некоторые из моих старых вопросов здесь, в StackOverflow, которые помогли мне преодолеть эти проблемы:
Если у меня все понятно, вам нужен элемент управления, в котором отображается что-то произвольное вместе с раскрывающейся кнопкой, которая отображает список элементов с флажками рядом с ними?
Я бы даже не стал пытаться изменить стиль ComboBox
, чтобы добиться этого. Проблема в том, что ComboBox
более специализирован, чем то, что вам нужно. Если вы посмотрите на пример ComboBox ControlTemplate , то увидите, что он просто использует элемент управления Popup
для отображения списка возможных значений.
Вы можете использовать части этого шаблона в качестве руководства для создания UserControl
, который легче понять и лучше предоставляет то, что вы хотите. Вы даже сможете добавить свойство SelectedItems
и такое, что ComboBox
не предоставляет.
Пример того, что я имею в виду под руководством: Popup
имеет свойство IsOpen
. В шаблоне элемента управления для него установлено значение {TemplateBinding IsDropDownOpen}
, что означает, что класс ComboBox
имеет свойство IsDropDownOpen
, которое изменяется для управления расширением / свертывание Popup
.