Wpf ListViewItem背景绑定到枚举

时间:2010-03-22 11:10:37

标签: wpf listview binding enums

我有一个绑定到ObservableCollection mPersonList的ListView。班级人员得到了一个enum Sex。我想要做的是将ListViewItem的背景设置为绿色(如果此人是男性),如果此人是女性则设置为红色。

感谢您的回答!

我试过这样但是它错了吗?

<Style x:Key="CustomListViewItemStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="Background" Value="{Binding Path=Status, Converter={StaticResource sexEnumToColor}}" />
</Style>

public class SexEnumToColor : IValueConverter
{
    #region IValueConverter Member

    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Sex tempSex = (Sex)value;
        Brush retval;

        switch (tempSex )
        {
            case Sex.Male:
                retval = Brushes.Blue;
                break;

            case Sex.Female:
                retval = Brushes.Red;
                break;

            default:
                retval = Brushes.Black;
                break;
        }

        return retval;
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

3 个答案:

答案 0 :(得分:1)

如果您没有使用数据模板,则明确地将绑定添加到ListViewItem的数据模板将不起作用。在这种情况下,你需要让风格发挥作用,并使其发挥作用,你需要知道它为什么不起作用。

你的风格出了什么问题,你已经分配了一把钥匙。创建任何元素时,WPF在资源字典中搜索其键为该元素类型的Style对象。如果找到一个,那就是它适用的风格。如果没有,则不会应用任何样式。

如果在样式声明中指定TargetType但省略x:Key,则在将其添加到资源字典时分配的键是该类型。但是,由于您已明确指定了样式的键,因此这是指定的键。所以WPF从来没有找到它,也没有得到应用。

由于您不希望将此样式全局添加到窗口中的每个ListViewItem,因此要做的事情可能是将其添加到ListView的资源字典中:

<ListView ItemsSource="{DynamicResource Data}">
    <ListView.Resources>
        <local:SexToColorConverter x:Key="SexConverter" />
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="Background"
                    Value="{Binding Path=Sex, Converter={StaticResource SexConverter}}" />
        </Style>
    </ListView.Resources>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Name"
                            DisplayMemberBinding="{Binding Name}" />
            <GridViewColumn Header="Sex"
                            DisplayMemberBinding="{Binding Sex}" />
        </GridView>
    </ListView.View>
</ListView>

答案 1 :(得分:0)

在Person类的模板中使用DataTrigger。

如果您发布了部分类定义和当前模板,我们可以完成它。

答案 2 :(得分:0)

您可以使用转换器绑定性别属性。像这样:

<ListView>
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding name}" Background="{Binding sex, Converter={StaticResource converterSexToColor}}" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

和转换器:

public class ConverterSexToColor : IValueConverter
{
    public object Convert(object value, Type targeTtype, object parameter, System.Globalization.CultureInfo culture)
    {
        return (Sex)value == Sex.Male ? Brushes.Green :  Brushes.Red;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}