Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF-在datatemplate中使用datatemplate时,无法在第4级选择treeview项_Wpf_C# 4.0 - Fatal编程技术网

WPF-在datatemplate中使用datatemplate时,无法在第4级选择treeview项

WPF-在datatemplate中使用datatemplate时,无法在第4级选择treeview项,wpf,c#-4.0,Wpf,C# 4.0,我尝试使用WPF/C.Net 4.0实现4个级别的treeview。它加载所有4个级别,但无法选择第4个级别,当选择第3个级别时,它选择第4个级别的组。 大陆->国家->地区->人工制品是一个结构,但还有另一个大陆->产品->人工制品 资源数据模板-> <DataTemplate x:Key="DistrictTemplates"> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding

我尝试使用WPF/C.Net 4.0实现4个级别的treeview。它加载所有4个级别,但无法选择第4个级别,当选择第3个级别时,它选择第4个级别的组。
大陆->国家->地区->人工制品是一个结构,但还有另一个大陆->产品->人工制品

资源数据模板->

<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>
<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="Country" />
</TreeViewItem>
</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>

还有一些其他的树状结构。我不能在树状结构视图中使用内联模板。参考资料,我也不知道是否可以使用这个HierarchycalDataTemplate,因为我不能调用Country.Districts.ArtifactName和两个层次结构,但我可以调用Country.Districts,然后Districts有代码属性,使用代码我可以找到工件。和im在usercontrol.resources中使用数据模板
我怎样才能做到这一点

我写了一篇文章,有四个层次。这是一个显示HL7消息结构的树视图。对于快速后台,HL7是一条字段分隔的消息。你有话要说。每条消息都有一段。每个段至少有一个字段。一个字段可以有多个组件。组件可以有子组件。此树显示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个显示层次结构,一个不显示层次结构,因此有3个HierarchycalDataTemplates和1个DataTemplate

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

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


希望这有帮助。

我终于解决了这个问题。谢谢Josh和大家

资源数据模板->

<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>
<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="Country" />
</TreeViewItem>
</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>

查找HierarchycalDataTemplate我也检查了这个,但它也不起作用。我可以从country对象获取地区。地区对象可以更改。因此,要访问工件,我们需要首先获取地区代码,然后使用该代码查找工件。不要将容器放在容器中使用的DataTemplate中。我的意思是,您的DataTemplate包含一个TreeViewItem,为什么?您不必也不应该这样做,TreeView负责为每个数据对象提供一个适当的容器项。只需将TreeViewItem图标、Textblock等的实际内容放在DataTemplate中即可。否则,您将有一个项目的可视化树,看起来像TreeView->TreeViewItem->ContentPresenter->TreeViewItem。我也同意Jodha的观点,HierarchycalDataTemplate更适合于此。希望您理解我的问题。感谢您的建议。我是WPF新手,但我检查了一些示例。有什么解释为什么总是选择两者吗级别为组?。任何人都可以在数据模板中不使用TreeView项而放置代码。还有一些其他treeItems。我不能在TreeView内调用。资源,而且我也很困惑,我可以使用此Hierarchy DataTemplate,因为我不能调用Country.Districts.ArtifactName,但我可以调用Country.Districts,然后Districts具有代码属性和by代码可以找到工件。我在usercontrol.resources中使用datatemplates。任何人都可以发布合适的示例代码。通过这个代码也可以帮助tx。这个代码示例是相关的。如果您确实具有层次结构,则HierarchycalDataTemplate将起作用。从我所看到的,你的树视图包含大陆,包含国家,包含地区,包含人工制品。如果您不能用TreeView轻松地表示此结构,则说明您的数据构造不正确。这样表示数据:从大陆集合开始。每个大陆都有一个国家的集合。每个国家都有一个地区集合。每个地区都有一批文物。而且,采纳dowhilefor的建议,不要将TreeView项目放入您的数据模板中。大陆->国家->地区->工件是一个结构,但还有另一个大陆->产品->工件,这意味着您的大陆将有第二个产品集合,其中每个产品都有工件集合。我认为您需要做的就是在数据类型与您的产品类型匹配的适当级别添加另一个分层数据模板。在这一点上,我认为您需要另一个用于工件的数据模板。 让我来玩玩,看看我能不能把上面的东西带到你需要的地方去。