首页 > 解决方案 > WPF ListBox - 以编程方式更改项目的背景颜色

问题描述

我有这样的事情:

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 岁,如何更改项目的背景?

标签: wpflistboxbackground-colorlistboxitem

解决方案


ListBoxItem可以通过更改项目容器样式来设置 a 的背景。然而,颜色的条件设置需要一个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与您的自定义转换器绑定,这会将年龄字符串转换为纯色画笔。

<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>

代码隐藏解决方案

假设您像这样在 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;

推荐阅读