Как отобразить строки в WPF ListView в разных цветах?


Я хотел бы заполнить WPF ListView строками, используя привязку данных. Мой код выглядит так (и работает! ;) ):

Xaml:

<ListView 
            ItemsSource="{Binding Entries}">
</ListView>

Я опустил некоторые коды для лучшего обзора. Записи-это IList<string>.

Пока все работает нормально. Теперь возникает проблема: строка в записях может содержать определенное ключевое слово, которое указывает, что эта строка должна отображаться с красным фоном внутри ListView. Допустим, у нас есть метод GetBackground (string s), который возвращает цвет в зависимости от строки.

Как я могу заставить ListView отображать свои элементы в правильном цвете. Моя первая идея состояла в том, чтобы иметь конвертер, преобразующий мою строку в цвет, используя вышеупомянутый метод. Где я должен добавить этот конвертер и как передать строку в конвертер в качестве параметра? моей первой мыслью было:

<ListView
    ItemsSource="{Binding Entries, Converter={StaticResource entryToColourConverter}, 
ConverterParameter=???}"
</ListView>
Есть ли у кого-нибудь идея, как это можно сделать? Я на правильном пути?

Наилучшие пожелания, Кристиан

Править 1: Изменил код (как первый шаг) в сторону:

<UserControl.Resources>
        <DataTemplate x:Key="entryTemplate">
            <TextBlock 
                Text="{Binding}"
                Background="Green"/>
        </DataTemplate>
</UserControl.Resources>

...

<ListView 
            ItemsSource="{Binding Entries}"
            ItemTemplate="{StaticResource entryTemplate}>
</ListView>
Однако это не работает вообще. Даже если я изменю текст на некоторое статическое значение, результат все равно будет таким же, как и в предыдущем коде.

Правка 2: Я нашел проблему, мой код выглядел так:

<ListView x:Name="lvEntries"
                  ItemTemplate="{StaticResource EntriesTemplate}"
                  ItemsSource="{Binding Entries, NotifyOnTargetUpdated=True}">

            <ListView.View>

                <GridView x:Name="gvEntries">
                    <GridViewColumn
                        HeaderContainerStyle="{StaticResource hcs}"
                        Header="Entry"
                        TextBlock.TextAlignment="Left">
                    </GridViewColumn>
                </GridView>
            </ListView.View>

        </ListView>

И этот ListView.Проблема заключалась в виде. При удалении этого, все работало! :) Теперь я должен выяснить, как решить эту проблему без ListView.Вид

2 3

2 ответа:

<Window.Resources>
    <local:EntryToBackgroundConverter x:Key="EntryToBackgroundConverter"/>
    <DataTemplate x:Key="EntryTemplate">
        <TextBlock Text="{Binding .}" Background="{Binding ., Converter={StaticResource EntryToBackgroundConverter}}"/>
    </DataTemplate>        
</Window.Resources>
<Grid>              
    <ListView ItemsSource="{Binding Entries}" ItemTemplate="{StaticResource EntryTemplate}"></ListView>        
</Grid>

Конвертер:

public class EntryToBackgroundConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string stringValue = value as string;

        if (string.IsNullOrEmpty(stringValue))
            return Brushes.Black;

        if (stringValue == "foreach")
            return Brushes.Blue;
        if (stringValue == "if")
            return Brushes.Blue;

        return Brushes.Black;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value;
    }
}

Вы на правильном пути... что-то вроде этого должно сработать...

Создайте шаблон элемента для ListView, а затем привяжите цвет текста (например) метки к свойству Entrie