Как отобразить строки в 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 ответа:
<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; } }
Вы на правильном пути... что-то вроде этого должно сработать...