根据Bool成员对象填充ListBoxItem背景

时间:2010-08-05 02:21:53

标签: wpf

我有一个有布尔成员的类,我想用我的类的集合填充一个Wpf ListBox。

如果我的布尔属性为false,我希望listboxitem的背景为不同的颜色。 XAML有可能吗?最好的方法是什么?

        class Mi
        {
            public bool mybool{get;set;}
        }
...
List<Mi> mycollection;// the datacontext

3 个答案:

答案 0 :(得分:4)

您可以使用DataTrigger:

<DataTemplate DataType="{x:Type my:Mi}">
    <Grid>
        <Grid.Style>
            <Style TargetType="Grid">
                <Setter PropertyName="Background" Value="White" />

                <Style.Triggers>
                    <DataTrigger Binding="{Binding mybool}" Value="True">
                        <Setter PropertyName="Background" Value="Yellow" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        <Grid.Style>
        ... your ListBoxItem contents here ...
    </Grid>
</DataTemplate>

答案 1 :(得分:3)

这是一个用于布尔值的快速通用转换器,允许您为任何类型的属性指定true值和false值不同的值。

[ValueConversion(typeof(bool), typeof(object))]
public class BooleanValueConverter : IValueConverter
{
    public object FalseValue { get; set; }
    public object TrueValue { get; set; }

    #region IValueConverter Members

    public object Convert(object value, Type targetType, 
                          object parameter, CultureInfo culture)
    {
        return (bool)value ? this.TrueValue : this.FalseValue;
    }

    public object ConvertBack(object value, Type targetType, 
                              object parameter, CultureInfo culture)
    {
        return object.Equals(this.TrueValue, value) ? true : false;
    }

    #endregion
}

像这样使用它。


<SolidColorBrush x:Key="TrueBrush" Color="Green" />
<SolidColorBrush x:Key="FalseBrush" Color="Red" />

<local:BooleanValueConverter x:Key="BooleanBackground" 
    TrueValue="{StaticResource TrueBrush}" 
    FalseValue="{StaticResource FalseBrush}" />

...

Background="{Binding Path=Some.PropertyPath.Ending.With.A.Boolean, 
                             Converter={StaticResource BooleanBackground}}" />

答案 2 :(得分:1)

您可以使用DataTemplateSelector实现此目的,它具有两个具有不同背景的模板。

更好的方法可能是将background属性绑定到布尔值并使用IValueConverter,它将返回适当的颜色。

Background="{Binding Path=mybool, Converter={StaticResource boolToBackgroundConverter}}"