目前,我正在研究WPF,但遇到以下问题:
我的数据模型(请参阅下文)具有3层分层数据(文件,文件中的一行,该行分为几部分)。我想在TreeView中以2个级别显示,这样第一级是文件,第二级项是IsMatch
列表的串联字符串(根据{ fileA("filename1"): {
line1: { part1("text1", false), part2("text2", true), part3("text3", false) },
line2: { part4("text4", false) }
} }
属性的格式不同)
所以这个样本数据
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中使用的白色和黄色背景)
我已经阅读了this的MS文档,这在整个问题上给了我很大的帮助。我不确定这是否可以在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>
Xaml:
Dim cmd1 As New SqlCommand("EXECUTE QUARTERLY", con1)
cmd1.CommandTimeout = 0
cmd1.ExecuteNonQuery()
答案 0 :(得分:2)
这基本上应该可以满足您的要求。尽管文本之间没有空格,但是您可以使用转换器或类似的东西来添加它。甚至可能删除整个ItemsControl
并让对流器接受集合并脱开字符串,我只想为您保留所有内容。
<TreeView x:Name="TvSearchResults" Width="200" Margin="20" ItemsSource="{Binding Data.FileLines}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Lines}">
<TextBlock Text="{Binding Path=Name}"/>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding TextParts}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsMatch}" Value="True">
<Setter Property="FontWeight" Value="Bold"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
答案 1 :(得分:1)
为简单起见:
<DataTemplate DataType="{x:Type m:ResultLine}">
<ItemsControl ItemsSource="{Binding TextParts}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</DataTemplate>
因此,您实际上需要使用ItemsControl
并为此容器设置水平方向的面板。