Динамическая установка цвета фона элемента управления Silverlight (Listbox)

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

        <ListBox Background="Red">
      <ListBox.ItemContainerStyle>
          <Style TargetType="ListBoxItem">
              <Setter Property="Background" Value="Red"/>
          </Style>
      </ListBox.ItemContainerStyle>
 <ListBox.ItemTemplate>
      <DataTemplate>
                    <StackPanel Orientation="Horizontal"
                                Margin="5">
                        <TextBlock VerticalAlignment="Bottom"
                                   FontFamily="Comic Sans MS"
                                   FontSize="12"
                                   Width="70"
                                   Text="{Binding Name}" />
                        <TextBlock VerticalAlignment="Bottom"
                                   FontFamily="Comic Sans MS"
                                   FontSize="12"
                                   Width="70"
                                   Text="{Binding Age}" />
                     </StackPanel>
                </DataTemplate>
        </ListBox.ItemTemplate>
      </ListBox>

РЕДАКТИРОВАТЬ: здесь написано

В Silverlight вы должны добавить атрибуты x: Key к своим пользовательским стилям и ссылаться на них как на статические ресурсы. Silverlight не поддерживает неявные стили, применяемые с использованием значения атрибута TargetType.

Влияет ли это на мой подход?


person Dan    schedule 30.09.2008    source источник


Ответы (4)


Хорошо - если вам нужна настраиваемая логика для определения фона, я бы подумал о создании простого класса IValueConverter. Вам просто нужно реализовать интерфейс IValueConverter и в его методе Convert изменить предоставленное значение на Brush.

Вот небольшой пост от Сахила Малика, который описывает IValueConverters - это может помочь:

http://blah.winsmarts.com/2007-3-WPF__DataBinding_to_Calculated_Values--The_IValueConverter_interface.aspx

person Matt Hamilton    schedule 30.09.2008

Чтобы привязать свой фон к нескольким свойствам, вы можете использовать IMultiValueConverter. Это похоже на IValueConverter, за исключением того, что он работает с MultiBinding, чтобы передать более одного значения в класс и получить обратно одно значение.

Вот сообщение, которое я нашел с прогоном по IMultiValueConverter и MultiBinding:

http://blog.paranoidferret.com/index.php/2008/07/21/wpf-tutorial-using-multibindings/

Изменить: если IMultiValueConverter недоступен (похоже, что Silverlight имеет только IValueConverter), вы всегда можете передать весь связанный объект (например, объект Person) в IValueConverter и использовать различные свойства, чтобы вернуть свою кисть.

person Matt Hamilton    schedule 30.09.2008

@Matt Спасибо за ответ. Я изучу триггеры.

Моя единственная проблема заключается в том, что логика определения того, следует ли окрашивать строку, немного сложнее, поэтому я не могу просто проверить свойство, поэтому мне действительно нужно запустить некоторую логику для определения цвета. Любые идеи?

Думаю, я мог бы создать объект пользовательского интерфейса со всеми необходимыми мне полями, но я вроде как не хотел применять такой подход.

person Dan    schedule 30.09.2008

Вы можете попробовать привязать что-то в вашем контрольном шаблоне (например, границу или что-то еще) к TemplateBackground. Затем установите фон в списке, чтобы определить его цвет.

<Border Margin="-2,-2,-2,0" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1,1,1,0" CornerRadius="11,11,0,0">
person Stephen Price    schedule 14.07.2009