0

WPF/C#.Net 4.0 を使用して 4 レベルのツリービューを実装しようとしました。4 レベルすべてをロードしますが、4 番目のレベルを選択できず、3 番目のレベルを選択すると 4 番目のレベルのグループが選択されます。Continent->Country->District->Artifacts は 1 つの構造ですが、別の構造があります。 Continent->Products->Artifacts

リソース DataTemplates->

<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 コード->

<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 sine を使用できるかどうかについても混乱しています。Country.Districts.ArtifactName を呼び出すことはできず、2 つの階層を取得しましたが、Country.Districts( )そして、Districtsにはコードプロパティがあり、コードを使用してアーティファクトを見つけることができます。そして、usercontrol.resources内でデータテンプレートを使用するにはどうすればよいですか?

4

2 に答える 2

2

これが私が書いたもので、4レベルの深さです。これは、HL7メッセージ構造を示すTreeViewです。簡単な背景として、HL7はフィールドで区切られたメッセージです。メッセージがあります。各メッセージにはセグメントがあります。各セグメントには、少なくとも1つのフィールドがあります。フィールドには複数のコンポーネントが含まれる場合があります。コンポーネントはサブコンポーネントを持つことができます。このツリーには、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

等...

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つは階層を示し、1つは階層を示さないため、3つのHierarchicalDataTemplatesと1つのDataTemplateがあります。

このように考えてください...HL7メッセージセグメント、フィールド、およびコンポーネントは、子を持っているため、ツリーノードです。HL7サブコンポーネントにはリーフがないため、リーフです。各ツリーノードはHierarchicalDataTemplateを取得しますが、各リーフはDataTemplateを取得するだけです。

各HierarchicalDataTemplatesは、DataTypeプロパティを使用して、表示するオブジェクトタイプを認識しています。ここで、コントロールに、表示されている子のタイプを伝えます。これにより、基本タイプコレクションを使用して、すべての子タイプを適切なノードレベルで表示できます。

お役に立てれば。

于 2012-05-24T14:02:31.420 に答える
0

最後に、私はこれを解決することができました.Joshとみんなに感謝します.

リソース DataTemplates->

<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 コード->

<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 に答える