ListBoxItems 背景与 ListBox ItemsSource 相同
ListBoxItems background the same as ListBox ItemsSource
我有一个绑定到 ObservableCollection<string>
的 WPF ListBox
ItemsSource
。列表框值为:
蓝色,
红色的,
绿色.
我希望商品的背景颜色与其价值相匹配。例如,我希望 Blue Item 的背景颜色为 Blue、Red to Red 等等。由于我使用的是 ItemsSource
,因此我无法找到更改每个 ListBoxItem
的方法。如何将 ListBoxItems
背景颜色绑定到这些相应的值?
提前致谢!!!
这可以通过多种方式实现,具体取决于您的用例。
解决方案 1 - 使用 ValueConverters
:
您可以使用 ListBox.ItemContainerStyle
设置 ListBoxItem
的样式,然后使用 ValueConverter
将 string
值转换为各自的值
SolidColorBrushes
.
XAML:
<ListBox ItemsSource="{Binding MyObservableCollection}" >
<ListBox.Resources>
<local:ColorConverter x:Key="converter"/>
</ListBox.Resources>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Background" Value="{Binding Path=.,
Converter={StaticResource converter}}"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
值转换器:
public class ColorConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
var color = value.ToString();
switch (color)
{
case "Blue":
return new SolidColorBrush(Colors.Blue);
case "Red":
return new SolidColorBrush(Colors.Red);
case "Green":
return new SolidColorBrush(Colors.Green);
}
return SystemColors.ControlColor;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
灵魂 2 - 使用 DataTriggers
:
同样,您可以使用 ListBox.ItemContainerStyle
设置 ListBoxItem
的样式,然后定义多个 DataTriggers
以根据项目的值更改 ListBoxItem.Background
。
这种方法是纯粹的 XAML:
<ListBox ItemsSource="{Binding MyObservableCollection}" >
<ListBox.Resources>
<System:String x:Key="red">Red</System:String>
<System:String x:Key="green">Green</System:String>
<System:String x:Key="blue">Blue</System:String>
</ListBox.Resources>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Style.Triggers>
<DataTrigger Binding="{Binding }" Value="{StaticResource red}">
<Setter Property="Background" Value="Red"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding }" Value="{StaticResource green}">
<Setter Property="Background" Value="Green"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding }" Value="{StaticResource blue}">
<Setter Property="Background" Value="Blue"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
编辑:
假设动态加载的颜色名称与 System.Windows.Media.Colors
的名称相同,那么您可以用以下方法替换第一个解决方案中的 Convert
方法:
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
var colorStr = value.ToString();
var color = (Color)System.Windows.Media.ColorConverter.ConvertFromString(colorStr);
return new SolidColorBrush(color);
}
如果你的颜色名称没有遵循特定的格式,它们可以是任何东西(即你的外部文件可以包含像 "VeryLightGreen" 或 "PrettyYellow" 这样的名称!)那么你应该定义你自己的 ColorDictionary
将这些名称翻译成所需的颜色:
public static class ColorTranslator
{
private static Dictionary<string, Color> ColorDictionary = LoadColors();
public static Color FromName(string name)
{
return ColorDictionary[name];
}
private static Dictionary<string, Color> LoadColors()
{
var dictionary = new Dictionary<string, Color>();
dictionary.Add("Red", Colors.Red);
dictionary.Add("Blue", Colors.Blue);
dictionary.Add("Green", Colors.Green);
dictionary.Add("VeryLightGreen", Colors.Honeydew);
dictionary.Add("PrettyYellow", Color.FromArgb(200,255,215,0));
return dictionary;
}
}
和Convert
方法:
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
var colorStr = value.ToString();
var color = ColorTranslator.FromName(colorStr);
return new SolidColorBrush(color);
}
我有一个绑定到 ObservableCollection<string>
的 WPF ListBox
ItemsSource
。列表框值为:
蓝色, 红色的, 绿色.
我希望商品的背景颜色与其价值相匹配。例如,我希望 Blue Item 的背景颜色为 Blue、Red to Red 等等。由于我使用的是 ItemsSource
,因此我无法找到更改每个 ListBoxItem
的方法。如何将 ListBoxItems
背景颜色绑定到这些相应的值?
提前致谢!!!
这可以通过多种方式实现,具体取决于您的用例。
解决方案 1 - 使用 ValueConverters
:
您可以使用 ListBox.ItemContainerStyle
设置 ListBoxItem
的样式,然后使用 ValueConverter
将 string
值转换为各自的值
SolidColorBrushes
.
XAML:
<ListBox ItemsSource="{Binding MyObservableCollection}" >
<ListBox.Resources>
<local:ColorConverter x:Key="converter"/>
</ListBox.Resources>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Background" Value="{Binding Path=.,
Converter={StaticResource converter}}"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
值转换器:
public class ColorConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
var color = value.ToString();
switch (color)
{
case "Blue":
return new SolidColorBrush(Colors.Blue);
case "Red":
return new SolidColorBrush(Colors.Red);
case "Green":
return new SolidColorBrush(Colors.Green);
}
return SystemColors.ControlColor;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
灵魂 2 - 使用 DataTriggers
:
同样,您可以使用 ListBox.ItemContainerStyle
设置 ListBoxItem
的样式,然后定义多个 DataTriggers
以根据项目的值更改 ListBoxItem.Background
。
这种方法是纯粹的 XAML:
<ListBox ItemsSource="{Binding MyObservableCollection}" >
<ListBox.Resources>
<System:String x:Key="red">Red</System:String>
<System:String x:Key="green">Green</System:String>
<System:String x:Key="blue">Blue</System:String>
</ListBox.Resources>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Style.Triggers>
<DataTrigger Binding="{Binding }" Value="{StaticResource red}">
<Setter Property="Background" Value="Red"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding }" Value="{StaticResource green}">
<Setter Property="Background" Value="Green"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding }" Value="{StaticResource blue}">
<Setter Property="Background" Value="Blue"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
编辑:
假设动态加载的颜色名称与 System.Windows.Media.Colors
的名称相同,那么您可以用以下方法替换第一个解决方案中的 Convert
方法:
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
var colorStr = value.ToString();
var color = (Color)System.Windows.Media.ColorConverter.ConvertFromString(colorStr);
return new SolidColorBrush(color);
}
如果你的颜色名称没有遵循特定的格式,它们可以是任何东西(即你的外部文件可以包含像 "VeryLightGreen" 或 "PrettyYellow" 这样的名称!)那么你应该定义你自己的 ColorDictionary
将这些名称翻译成所需的颜色:
public static class ColorTranslator
{
private static Dictionary<string, Color> ColorDictionary = LoadColors();
public static Color FromName(string name)
{
return ColorDictionary[name];
}
private static Dictionary<string, Color> LoadColors()
{
var dictionary = new Dictionary<string, Color>();
dictionary.Add("Red", Colors.Red);
dictionary.Add("Blue", Colors.Blue);
dictionary.Add("Green", Colors.Green);
dictionary.Add("VeryLightGreen", Colors.Honeydew);
dictionary.Add("PrettyYellow", Color.FromArgb(200,255,215,0));
return dictionary;
}
}
和Convert
方法:
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
var colorStr = value.ToString();
var color = ColorTranslator.FromName(colorStr);
return new SolidColorBrush(color);
}