Установка цвета фона отдельных элементов WPF ListBox

Я хочу установить цвет фона отдельно для каждого элемента в WPF ListBox. например Если я добавляю виджеты в ListBox, я могу установить цвет фона для каждого из них в зависимости от типа виджета. Это должно быть выполнено в коде (а не в XAML), поскольку я знаю только элементы во время выполнения.

Я знаю, как использовать ItemContainerStyle для установки стиля для всех элементов, но как это сделать отдельно для каждого элемента?


person Des    schedule 11.09.2011    source источник
comment
Определение того, какие атрибуты виджета будут определять цвет, сделало бы этот вопрос намного лучше.   -  person Henk Holterman    schedule 11.09.2011


Ответы (2)


Да, вы устанавливаете ItemContainerStyle с помощью StyleSelector.

Этот пример в MSDN - именно то, что вам нужно. находясь в поиске.

person loxxy    schedule 11.09.2011
comment
Спасибо Loxxy и Роберту. Я выбрал решение StyleSelector. Я получаю доступ к фактическому элементу в SelectStyle, поэтому могу установить фон в соответствии с содержимым элемента. - person Des; 11.09.2011

Есть много способов сделать это.

Один из них - использовать StyleSelector, как предлагает loxxy. Это довольно мало в моем списке, потому что такой код сложнее читать (ну, найти) и тестировать, чем мне бы хотелось.

Другой - использовать DataTrigger в стиле. Это просто, если (и только если) все элементы реализуют общее свойство, которое можно использовать в триггере. Вам может пригодиться реализация класса-оболочки, который предоставляет это общее свойство и содержит логику, определяющую, какое значение присваивать свойству на основе объекта, который он обертывает. (Будет ли это проще, чем StyleSelector, безусловно, спорный.)

Если элементы действительно разнородны, вы можете добиться результата, используя шаблоны данных, например:

<ListBox.Resources>
   <DataTemplate DataType="{x:Type local:Foo}">
      <TextBlock Text="{Binding FooText}" Background="Red"/>
   </DataTemplate>
   <DataTemplate DataType="{x:Type local:Bar}">
      <TextBlock Text="{Binding BarText}" Background="Yellow"/>
   </DataTemplate>
   <DataTemplate DataType="{x:Type local:Baz}">
      <TextBlock Text="{Binding BazText}" Background="PapayaWhip"/>
   </DataTemplate>
</ListBox.Resources>

и т.д. Это, как правило, мой первый выбор, но ваш вопрос на самом деле недостаточно объясняет обстоятельства, чтобы понять, правильный ли это путь или нет.

person Robert Rossney    schedule 11.09.2011