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

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

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

8
задан Andrey Shchekin 6 February 2010 в 20:57
поделиться

3 ответа

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

<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 , в зависимости от ваших предпочтений.

20
ответ дан 5 December 2019 в 08:52
поделиться

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

-1
ответ дан 5 December 2019 в 08:52
поделиться

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

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

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

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

0
ответ дан 5 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: