Установить фон для 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;