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 的样式,然后使用 ValueConverterstring 值转换为各自的值 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);
    }