Как отображать строки в WPF ListView разными цветами? - PullRequest
3 голосов
/ 18 февраля 2011

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

Xaml:

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

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

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

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

<ListView
    ItemsSource="{Binding Entries, Converter={StaticResource entryToColourConverter}, 
ConverterParameter=???}"
</ListView>

У кого-нибудь есть идеи, как это можно сделать? Я на правильном пути?

С наилучшими пожеланиями, Christian

РЕДАКТИРОВАТЬ 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.View был проблемой. После удаления все работало! :) Теперь я должен выяснить, как решить эту проблему без ListView.View

Ответы [ 2 ]

4 голосов
/ 18 февраля 2011
<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;
    }
}

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

0 голосов
/ 18 февраля 2011

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

...