WPF ListBox - программно изменяет цвет фона элементов - PullRequest
0 голосов
/ 10 июля 2020

У меня примерно так:

public class Member {
   public int Id { get; set; }
   public string Name { get; set; }
   public string Age { get; set; }
   ...
}

List<Member> members = new List<Member>{ new Member(Id = 1, Name="Chuck", Age="32"), new Member(Id = 2, Name="Eve", Age="10")};
Listbox1.ItemsSource = members;

Как изменить фон элементов в ListBox, если возраст меньше 18?

1 Ответ

0 голосов
/ 10 июля 2020

Установить фон для ListBoxItem можно, изменив стиль контейнера элемента. Однако для условной настройки цвета требуется IValueConverter. Вы можете написать свой для проверки Age. Рассмотрите возможность создания Age свойства типа int, иначе вам придется анализировать его при каждом преобразовании из string.

public class AgeToColorConverter : IValueConverter
{
   public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
   {
      return int.Parse((string)value) < 18 ? new SolidColorBrush(Colors.Red) : new SolidColorBrush(Colors.Blue);
   }

   public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
   {
      throw new InvalidOperationException("This is a one-way conversion.");
   }
}

XAML-решение

В XAML вы бы создайте экземпляр вашего конвертера в ресурсах списка или любого другого словаря ресурсов. Затем вы должны привязать ItemsSource к своему свойству members и добавить собственный стиль контейнера элементов. Стиль основан на стиле по умолчанию для ListBoxItem. В нем вы привязываете свойство Background к Age с помощью своего настраиваемого конвертера, который преобразует строку возраста в solid color bru sh.

<ListBox x:Name="Listbox1" ItemsSource="{Binding members}">
   <ListBox.Resources>
      <local:AgeToColorConverter x:Key="AgeToColorConverter"/>
   </ListBox.Resources>
   <ListBox.ItemContainerStyle>
      <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
         <Setter Property="Background" Value="{Binding Age, Converter={StaticResource AgeToColorConverter}}"/>
      </Style>
   </ListBox.ItemContainerStyle>
</ListBox>

Решение Code-Behind

Предположим, вы определили свой список в XAML следующим образом.

<ListBox x:Name="Listbox1"/>

Тогда к этому коду применяется то же, что и для решения XAML, за исключением того, что мы создаем конвертер как локальную переменную и элементы источник назначается напрямую вместо привязки.

var ageToColorConverter = new AgeToColorConverter();
var baseItemContainerStyle = (Style)FindResource(typeof(ListBoxItem));
var itemContainerStyle = new Style(typeof(ListBoxItem), baseItemContainerStyle);
var backgroundSetter = new Setter(BackgroundProperty, new Binding("Age") { Converter = ageToColorConverter });

itemContainerStyle.Setters.Add(backgroundSetter);

Listbox1.ItemContainerStyle = itemContainerStyle;
Listbox1.ItemsSource = members;
...