Wpf ListViewItem Фоновая привязка к enum - PullRequest
1 голос
/ 22 марта 2010

У меня есть ListView, который привязан к ObservableCollection mPersonList.Классный человек получил перечисление 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 ]

1 голос
/ 23 марта 2010

Явное добавление привязки к шаблону данных для 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>
0 голосов
/ 22 марта 2010

Вы можете связать сексуальную собственность с конвертером. Примерно так:

<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();
    }
}
0 голосов
/ 22 марта 2010

Используйте DataTrigger в своем шаблоне класса Person.

Если вы опубликуете часть определения класса и текущий шаблон, мы могли бы завершить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...