В настоящее время я копаюсь в WPF и у меня возникает следующая проблема:
Моя модель данных (см. Ниже) имеет иерархические данные в 3 слоя (файл, строка в файле, строка, разбитая на части). Это я хочу отобразить в TreeView на 2 уровнях, так что первый уровень - это файлы, а элементы второго уровня - это объединенные строки списка TextParts
(отформатированные в соответствии со свойством IsMatch
).
Итак, этот пример данных
{ fileA("filename1"): {
line1: { part1("text1", false), part2("text2", true), part3("text3", false) },
line2: { part4("text4", false) }
} }
должно выглядеть так:
(примечание: я использовал жирный шрифт и курсив вместо белого и желтого фона, используемого в моем xaml)
Я уже прочитал эту документацию MS, которая дала мне хороший толчок во всем этом вопросе. Я не уверен, что это можно сделать в xaml, или можно как-то сгенерировать шаблон в коде?
Моя модель данных:
class MyModel {
public ObservableCollection<ResultFile> FileLines { get; }
}
class ResultFile {
public ObservableCollection<ResultLine> Lines { get; }
public string Name { get; set; }
}
class ResultLine {
public ObservableCollection<ResultTextPart> TextParts { get; }
}
class ResultTextPart {
public string Text { get; set; }
public bool IsMatch { get; set; }
}
Xaml:
<TreeView x:Name="TvSearchResults">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type m:ResultFile}" ItemsSource="{Binding Lines}">
<StackPanel Orientation="Horizontal"><TextBlock Text="{Binding Name}"/> <!-- ... --> </StackPanel>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type m:ResultLine}">
<!-- how to display the list of ResultTextPart as single line ? -->
</DataTemplate>
<DataTemplate DataType="{x:Type m:ResultTextPart}">
<TextBlock Text="{Binding Text}" Name="tviTextPart" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsMatch}" Value="true">
<Setter Property="Background" TargetName="tviTextPart" Value="Yellow"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</TreeView.Resources>
</TreeView>