一个TreeViewItem中的Concat字符串列表

时间:2019-05-03 10:21:05

标签: c# wpf datatemplate

目前,我正在研究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; }
}

应如下所示:

  • 文件名1
    • text1 文本2 text3
    • text4

(备注:我在这里使用粗体和斜体,而不是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()

2 个答案:

答案 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并为此容器设置水平方向的面板。