WPF: как настроить SelectionBoxItem в ComboBox

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

Как я могу это сделать, оставаясь в рамках текущей темы ComboBox (так что замена ControlTemplate не возможна)? Насколько я вижу, все свойства SelectionBox * не редактируются, и внутри ComboBox использует неназванный ContentPresenter.

Я бы сделал это так:

  ...   ...           ...  

Причина этого заключается в том, что CombinedTemplate обычно использует NormalItemTemplate для представления своих данных, но если нет предка ComboBoxItem он предполагает, что он находится в поле выбора, поэтому использует SelectionBoxTemplate.

Обратите внимание, что три DataTemplates могут быть включены в любой уровень ResourceDictionary (не только на уровне Window ), либо даже непосредственно в ComboBox , в зависимости от ваших предпочтений.

Если у меня есть это прямо, вы хотите, чтобы элемент управления имел что-то произвольное, а также раскрывающееся меню, которое отображает список элементов с рядом с ними флажками?

Я бы даже не стал пытаться переделать ComboBox чтобы добиться этого. Проблема в том, что ComboBox более специализирован по другому пути, чем то, что вам нужно. Если вы посмотрите на пример Controlboem , посмотрите, что он просто использует элемент управления Popup для отображения списка возможных значений.

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

Пример того, что я имею в виду под руководством: Popup имеет свойство IsOpen . В шаблоне управления он установлен в {TemplateBinding IsDropDownOpen} , что означает, что class ComboBox имеет свойство IsDropDownOpen , которое изменяется для управления IsDropDownOpen .

Комментарий Алексея Митева к ответу Рэя Бернса вдохновил меня написать следующий разумно короткий class утилиты, который я теперь использую во всех моих проектах WPF:

 public class ComboBoxItemTemplateSelector : DataTemplateSelector { public List SelectedItemTemplates { get; } = new List(); public List DropDownItemTemplates { get; } = new List(); public override DataTemplate SelectTemplate(object item, DependencyObject container) { return GetVisualParent(container) == null ? ChooseFrom(SelectedItemTemplates, item) : ChooseFrom(DropDownItemTemplates, item); } private static DataTemplate ChooseFrom(IEnumerable templates, object item) { if (item == null) return null; var targetType = item.GetType(); return templates.FirstOrDefault(t => (t.DataType as Type) == targetType); } private static T GetVisualParent(DependencyObject child) where T : Visual { while (child != null && !(child is T)) child = VisualTreeHelper.GetParent(child); return child as T; } } 

С этим в панели инструментов можно написать XAML следующим образом:

                             

Вам нужно посмотреть триггеры и стили . Вы также можете посмотреть некоторые из моих старых вопросов здесь, в StackOverflow, которые помогли мне преодолеть эти проблемы:

  • Отображение содержимого только в том случае, если выбран ListViewItem
  • Использование стилей в Windows Presentation Foundation
  • Как ссылаться на ресурс CSS / JS / image в шаблоне Facelets?
  • Исходное и наследование в Android
  • WPF - Как создать кнопку изображения с шаблоном
  • Вложенные шаблоны с зависимой областью
  • Шаблоны метапрограммирования - разница между использованием Enum Hack и статическим контуром
  • c ++ шаблонная функция частичной специализации
  • Bash Templating: Как создать файлы конфигурации из шаблонов с Bash?
  • Можно ли явно указать параметры шаблона конструктора?
  • Поиск имен в шаблонах C ++
  • Каковы некоторые параметры шаблона шаблона?
  • Специализация шаблона на основе classа inherit
  • Interesting Posts

    Java8: двусмысленность с lambdas и перегруженные методы

    Вывод аргумента шаблона из подписи вызова std :: function

    Получить значения из файла свойств с помощью Groovy

    SSH работает медленно на cygwin

    Какие различия, если таковые имеются, между C ++ 03 и C ++ 11 могут быть обнаружены во время выполнения?

    Альтернатива использованию usbcopy для создания USB-накопителя Solaris Text Installer

    Отображение валюты в индийском формате нумерации

    Создание XML-документа с использованием пространств имен в Java

    Пакетное разделение многих AVI на 2 части?

    BroadcastReceiver при изменении состояния сети Wi-Fi или 3g

    Ошибка: выполнение выполнено для задачи ‘: app: transformResourcesWithMergeJavaResForDebug’

    Лев, указавший неправильную версию JDK

    PowerPoint: отображать только объекты, относящиеся к определенному шагу анимации

    Что такое исключение NoSuchBeanDefinitionException и как его исправить?

    Не удалось создать / открыть файл блокировки: /data/mongod.lock errno: 13 Разрешено отклонение

    Давайте будем гением компьютера.