wpf - 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 岁,如何更改项目的背景?
解决方案
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;
推荐阅读
- python - 在 python 中链接日期时间函数时,我如何知道何时使用括号?
- unity3d - NullReferenceException:对象引用未设置为对象 TreeDestroy.Update () 的实例(位于 Assets/Scenes/Trees/TreeDestroy.cs:22)
- python - 在python中的函数中操作变量
- vue.js - [Vue 警告]:渲染错误:“ReferenceError:文件未定义”[Vuetify + NuxtJS]
- r - 重新采样 - 模型 %in% 模型中的错误:找不到对象“模型”
- scapy - Wireshark 搞砸 arp 中毒
- sql - 返回一列的总行数
- reactjs - Typedoc 有很多关于 .d.ts 文件的错误
- xpath-1.0 - 在 Xpath 1 中列出项目是否有更快/更简洁的语法?
- fastapi - FASTAPI 异步 def 与 Def