0

我尝试使用 WPF/C#.Net 4.0 实现具有 4 个级别的树视图。它加载所有 4 个级别但无法选择第 4 级,并且在选择第 3 级时它选择具有第 4 级的组。Continent->Country->District->Artifacts 是一种结构,但还有另一种结构 Continent->Products->Artifacts

资源数据模板->

<DataTemplate x:Key="DistrictTemplates">
<StackPanel Orientation="Horizontal">   
<TextBlock Text="{Binding Path=ArtifactName}" />
</StackPanel>
</DataTemplate>

<DataTemplate x:Key="CountryTemplate">
<TreeViewItem ItemsSource="{Binding Path=District}" 
ItemTemplate="  {StaticResource DistrictTemplates}" 
Header="{Binding Path=Code}">           
</TreeViewItem>
</DataTemplate>

树视图代码->

<TreeView Name="treeExplorer" MouseDoubleClick="TreeView_MouseDoubleClick" SelectedItemChanged="treeExplorer_SelectedItemChanged">
 <TreeViewItem Name="tviDefinition" IsExpanded="True" Header="Continent">
<TreeViewItem ItemsSource="{Binding Path=Country}" ItemTemplate="{StaticResource CountryTemplate}" Header="Country" />
</TreeViewItem>
</TreeView>

还有一些其他树项。我不能在 TreeView.Resources 中使用内联模板,如果可以使用这个 HierarchicalDataTemplate 我也很困惑,因为我不能调用 Country.Districts.ArtifactName 并有两个层次结构,但我可以调用 Country.Districts( ) 然后 Districts 具有 code 属性并使用代码我可以找到 Artifacts.And 我在 usercontrol.resources 中使用 datatemplates 我怎么能做到这一点?

4

2 回答 2

2

这是我写的 4 级深度的东西。这是一个显示 HL7 消息结构的 TreeView。对于快速背景,HL7 是一个字段分隔的消息。你有一条信息。每条消息都有一个 Segment。每个 Segment 至少有一个字段。一个字段可以有多个组件。一个组件可以有子组件。此树显示 HL7 消息结构,其中每个级别都是 HL7 消息格式的一部分。

例如,如果消息中有 PID 段,则树将如下所示:

PID
...PID.1
...PID.2
......PID.2.1
......PID.2.2
......PID.2.3
......PID.2.4
.........PID.2.4.1
.........PID.2.4.2

ETC...

这是 XAML:

     <TreeView x:Name="hl7Structure" ItemsSource="{Binding Path=MessageSegments}" IsEnabled="True">
        <TreeView.Resources>
           <HierarchicalDataTemplate DataType="{x:Type MyNamespace:MessageSegment}" ItemsSource="{Binding Path=Fields}">
              <TextBox x:Name="segmentName" BorderBrush="Transparent" BorderThickness="0" Text="{Binding Path=Name}" FocusVisualStyle="{x:Null}" />
           </HierarchicalDataTemplate>
           <HierarchicalDataTemplate DataType="{x:Type MyNamespace:MessageField}" ItemsSource="{Binding Path=Components}">
              <TextBlock x:Name="fieldName" Text="{Binding Path=Name}" ToolTip="{Binding Path=Info}" />
           </HierarchicalDataTemplate>
           <HierarchicalDataTemplate DataType="{x:Type MyNamespace:MessageComponent}" ItemsSource="{Binding Path=Subcomponents}">
              <TextBlock x:Name="componentName" Text="{Binding Path=Name}" ToolTip="{Binding Path=Info}" />
           </HierarchicalDataTemplate>
           <DataTemplate DataType="{x:Type MyNamespace:MessageSubcomponent}">
              <TextBlock x:Name="subComponentName" Text="{Binding Path=Name}" ToolTip="{Binding Path=Info}" />
           </DataTemplate>
        </TreeView.Resources>
    </TreeView>

现在解释它是如何工作的。我有一个每个 HL7 消息片段都继承的基础对象。TreeView 的 ItemsSource 绑定到该集合。由于有 4 个级别,其中 3 个显示层次结构,一个不显示层次结构,因此有 3 个 HierarchicalDataTemplates 和 1 个 DataTemplate。

这样想……HL7 消息段、字段和组件是树节点,因为它们有子节点。HL7 子组件是一个叶子,因为它没有。每个树节点都获得一个 HierarchicalDataTemplate,但每个叶子只获得一个 DataTemplate。

通过使用 DataType 属性,每个 HierarchicalDataTemplates 都知道要显示的对象类型。这是我告诉控件的地方,它正在显示的子类型。这允许我使用基本类型集合,然后在其适当的节点级别显示所有子类型。

希望这可以帮助。

于 2012-05-24T14:02:31.420 回答
0

最后我设法解决了这个问题。谢谢乔希和大家。

资源数据模板->

<DataTemplate x:Key="DistrictTemplates">
<StackPanel Orientation="Horizontal">   
<TextBlock Text="{Binding Path=ArtifactName}" />
</StackPanel>
</DataTemplate>

<HierarchicalDataTemplate x:Key="CountryTemplate" DataType="Continent.Countries" ItemsSource="{Binding Path=District}" ItemTemplate="{StaticResource DistrictTemplates}">
<TextBlock Text="{Binding Path=Code}"/>    
</HierarchicalDataTemplate>

树视图代码->

<TreeView Name="treeExplorer" MouseDoubleClick="TreeView_MouseDoubleClick" SelectedItemChanged="treeExplorer_SelectedItemChanged">
<TreeViewItem Name="tviDefinition" IsExpanded="True" Header="Continent">
<TreeViewItem ItemsSource="{Binding Path=Country}" ItemTemplate="{StaticResource CountryTemplate}" Header="Countries" />
</TreeViewItem>
</TreeView>
于 2012-05-28T06:21:26.900 回答