设置ListBox项目背景为LinearGradientBrush,具体取决于ItemSource数据绑定值

问题描述

|| 到目前为止,这是我尝试根据数据绑定对象的int值在列表框项目(列表)中实现渐变背景的方法 我的对象具有简化形式:
public class Item {
 public string name { get; set; }
 public string address { get; set; }
 public int highlight { get; set; }
}
转换器尝试: 使用此转换器:
public class BusinessTypetoBackgroundConverter : IValueConverter
{
    private static readonly LinearGradientBrush normalBkg = new LinearGradientBrush
    {
        StartPoint = new Point(0,0),EndPoint = new Point(0,1),GradientStops = new GradientStopCollection
                            {
                                new GradientStop {Color = Util.GetColorFromHex(\"#4ce6e6e6\")},new GradientStop {Color = Util.GetColorFromHex(\"#ffe6e6e6\")}
                            }
    };

    private static readonly LinearGradientBrush HighlightedBkg = new LinearGradientBrush
    {
        StartPoint = new Point(0,GradientStops = new GradientStopCollection
                                                {
                                                    new GradientStop {Color = Util.GetColorFromHex(\"#4cffffcc\")},new GradientStop {Color = Util.GetColorFromHex(\"#ffffffcc\")}
                                                }
    };

    public object Convert(object value,Type targettype,object parameter,CultureInfo culture)
    {
        switch ((int)value)
        {
            case 1:
                return HighlightedBkg;
            case 2:
                return normalBkg;
            default:
                return normalBkg;
        }
    }

    public object ConvertBack(object value,CultureInfo culture)
    {
        throw new NotImplementedException(\"BusinessTypetoBackgroundConverter ConvertBack Method Not Implemented\");
    }
}
而这个项目模板
<ListBox                     
Name=\"lstResults\" 
ItemContainerStyle=\"{StaticResource ListBoxItemStyle1}\">
<ListBox.ItemTemplate>
    <DataTemplate>                           
        <Grid Background=\"{Binding highlight,Converter={StaticResource myConverter}}\">
            <StackPanel>
                <TextBlock Text=\"{Binding name}\" textwrapping=\"Wrap\" FontSize=\"24\" FontWeight=\"Bold\" Foreground=\"Black\"/>
                <TextBlock Text=\"{Binding address}\" textwrapping=\"Wrap\" FontSize=\"24\" Foreground=\"Black\" />
            </StackPanel>
        </Grid>
    </DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
尝试背后的代码 向我的Item对象添加了“ LinearGradientBrush背景”属性
public LinearGradientBrush background
{
    get
    {
        if (highlight == 1) return HighlightedBkg;
        else return normalBkg;
    }
}
在这两种情况下,仅将“渐变”的“开始”颜色应用于listItem(网格背景)。所以我最终得到纯色:) 无论如何,有没有从代码中设置背景ti的渐变,而不使用XAML表示法:
<LinearGradientBrush StartPoint=\"0,0\" EndPoint=\"0,1\">
    <GradientStopCollection>
        <GradientStop Color=\"#ff444444\" Offset=\"0\" />
        <GradientStop Color=\"#ff000000\" Offset=\"1\" />
    </GradientStopCollection>
</LinearGradientBrush>
    

解决方法

问题是,当您在代码中指定渐变停止时,您未指定偏移量。 但是,我建议您不要避免使用Xaml作为解决方案。首先阅读此博客:通用布尔值转换器。我还建议您的Hightlight属性应为
bool
类型,而不是int类型。 通过将博客中的转换器代码包含在您的项目中,您应该可以执行以下操作:
<Grid x:Name=\"LayoutRoot\">
   <Grid.Resources>
       <local:BoolToBrushConverter x:Key=\"Highlighter\">
            <local:BoolToBrushConverter.TrueValue>
                <LinearGradientBrush StartPoint=\"0,0\" EndPoint=\"0,1\">
                  <GradientStopCollection>
                <GradientStop Color=\"#4cffffcc\" Offset=\"0\" />
                <GradientStop Color=\"#ffffffcc\" Offset=\"1\" />
                  </GradientStopCollection>
                 </LinearGradientBrush>
            </local:BoolToBrushConverter.TrueValue>
            <local:BoolToBrushConverter.FalseValue>
                <LinearGradientBrush StartPoint=\"0,1\">
                  <GradientStopCollection>
                <GradientStop Color=\"#4ce6e6e6\" Offset=\"0\" />
                <GradientStop Color=\"#ffe6e6e6\" Offset=\"1\" />
                  </GradientStopCollection>
                 </LinearGradientBrush>
            </local:BoolToBrushConverter.FalseValue>
       </local:BoolToBrushConverter>
   </Grid.Resources>

<ListBox                     
Name=\"lstResults\" 
ItemContainerStyle=\"{StaticResource ListBoxItemStyle1}\">
<ListBox.ItemTemplate>
    <DataTemplate>                           
        <Grid Background=\"{Binding highlight,Converter={StaticResource Highlighter}}\">
            <StackPanel>
                <TextBlock Text=\"{Binding name}\" TextWrapping=\"Wrap\" FontSize=\"24\" FontWeight=\"Bold\" Foreground=\"Black\"/>
                <TextBlock Text=\"{Binding address}\" TextWrapping=\"Wrap\" FontSize=\"24\" Foreground=\"Black\" />
            </StackPanel>
        </Grid>
    </DataTemplate>
</ListBox.ItemTemplate>
</ListBox> 
这种方法不仅使您能够以更熟悉的Xaml方式保持视觉描述,而且更加灵活和可恢复。     ,您需要将背景绑定更改为
Background=\"{Binding highlight,Converter={StaticResource myConverter}}\"