Как бы я сделал ComboBox, который отображает произвольный контент как часть шаблона элемента? - PullRequest
0 голосов
/ 18 июня 2009

Мне нужно создать несколько полей со списком для представления значений перечисления. Я хочу, чтобы значения были представлены с некоторым графическим предварительным просмотром слева и текстом справа. Часть «предварительного просмотра» дисплея может быть элементом управления, изображением или другим содержимым. Я попробовал два подхода и потерпел неудачу в обоих, поэтому мне любопытно, какие могут быть альтернативы В моих тестах «предварительный просмотр» - это кнопка, потому что ее удобно создавать, но в действительности это будут либо пользовательские элементы управления, либо элементы управления DrawingImage.

Для первого подхода я решил использовать ContentPresenter для отображения предварительного просмотра контента для меня. Для этого я создал элемент управления с соответствующими свойствами и шаблоном. Я создал тип коллекции, который заполнил себя экземплярами этого элемента управления, а затем поместил экземпляр коллекции в ресурсы моего окна. Я связал свойство ComboBox ItemSource с этой коллекцией. Он отлично работает, когда есть один ComboBox, но когда ресурс использует несколько ComboBox, один из ComboBox не отображает значений. Я полагаю, что это, вероятно, связано с тем фактом, что элементы управления являются его содержимым, и происходит какая-то проблема с воспитанием детей.

Я решил, что это неправильный подход, и попытался использовать ItemTemplate ComboBox для своей грязной работы. Я изменил класс данных для наследования от DependencyObject вместо Control и использовал старый стиль элемента управления в качестве шаблона данных для типа данных. Это по-прежнему имеет проблемы, если несколько ComboBox связываются с одним экземпляром ресурса; первый ComboBox отображает содержимое предварительного просмотра правильно, но как только вы опускаете второй ComboBox, содержимое предварительного просмотра исчезает из обоих ComboBox. При таком подходе выбранный элемент также не отображается в ComboBox, хотя, возможно, я пропустил какой-то другой шаблон, который мне нужно установить для этого. Если я устанавливаю DataTemplate как ItemTemplate ComboBox напрямую, выбранный элемент отображается правильно, но разрушает элемент управления во всплывающем окне. Я определенно не делаю вещи прямо здесь.

Второй метод работает, если я создаю два экземпляра коллекции в моих ресурсах, но это не совсем практично. Я мог бы реструктурировать свое приложение, чтобы установить привязки к частным экземплярам коллекции в коде, но это кажется довольно неприятным. Я мог бы получить новый ComboBox для каждого типа коллекции и автоматически использовать новый экземпляр коллекции, но это кажется слишком большой работой. Кажется, что то, что я хочу, было бы чем-то необычным, но я не могу найти то, что работает. Что я делаю неправильно?

1 Ответ

2 голосов
/ 18 июня 2009

Не следует использовать производные объекты FrameworkElement в качестве содержимого в ItemControls, поскольку они могут отображаться только один раз.

Вместо этого используйте DataTemplates для управления отображением ваших элементов в ComboBox. В действительно сложных случаях вы можете использовать селектор DataTemplate. У Bea Stollnitz есть отличный пост об этом здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...