C# 层次数据结构WPF TreeListView数据触发器
我正在尝试创建一个树列表视图,该视图显示的信息与父视图不同 从现在的情况来看,子对象显示的信息与父对象相同。我在想,我该怎么做。我的上一篇文章对我来说不是很有意义,它的效果不是很好。我想知道是否有人能为我更深入地解释这一点 这是最后一篇帖子:C# 层次数据结构WPF TreeListView数据触发器,c#,wpf,xaml,treeview,C#,Wpf,Xaml,Treeview,我正在尝试创建一个树列表视图,该视图显示的信息与父视图不同 从现在的情况来看,子对象显示的信息与父对象相同。我在想,我该怎么做。我的上一篇文章对我来说不是很有意义,它的效果不是很好。我想知道是否有人能为我更深入地解释这一点 这是最后一篇帖子: 你的问题源于你的父母和孩子属于同一类型。两者都使用相同的模板,这里需要的是分层的数据结构 如果您有一个父任务,它有一个子任务集合,并且子任务的类型与父任务不同,那么您会很酷。(因为您可以为子级提供与父级不同的模板) 另一种方法是构建一个视图模型,具有两
你的问题源于你的父母和孩子属于同一类型。两者都使用相同的模板,这里需要的是分层的数据结构
如果您有一个父任务,它有一个子任务集合,并且子任务的类型与父任务不同,那么您会很酷。(因为您可以为子级提供与父级不同的模板)
另一种方法是构建一个视图模型,具有两种不同的类型,一种用于任务概述,另一种用于子任务
然而,我发现了一种基于集合大小使用触发器的黑客解决方案(当count为0时,我假设它是一个叶节点),更好的方法是在对象上有一个属性,该属性说明它是哪种类型,父节点还是子节点,这可以很容易地使用视图模型来完成,或者可以将该属性放在业务对象上。并下载TreeViewTest.zip示例解决方案
上述项目不是一个理想的解决方案。我每次都创建视图模型。它提供了超出直接wpf的灵活性和控制能力
该项目包含这段代码,这是一个棘手的问题(注意绑定上的字符串格式,它们非常酷)
如果要在树视图中显示父子关系。(只有一层深,因此子节点都是叶节点)。将树视图绑定到父元素集合。然后,为父对象创建分层数据模板,为子对象创建标准数据模板
在您给出的示例中,您有一个对象类型为信息的父对象,该父对象具有子对象类型的集合详细信息,父对象上的详细信息(子对象)集合称为子对象
所以我们为孩子们做了一个模板,然后为父母做了一个模板
<!--Child (detail) DataTemplate-->
<DataTemplate
DataType="{x:Type local:detail}">
<TextBox Text="{Binding Path=Some child binding}"/>
</DataTemplate>
<!--Parent (information) Hierarchical Template-->
<HierarchicalDataTemplate
DataType="{x:Type local:information}"
ItemsSource="{Binding Path=Child}">
<TextBox Text="{Binding Path=Some parent binding}"/>
</HierarchicalDataTemplate>
由于父对象和子对象属于不同的对象类型,树视图将获取父模板,该模板具有项目源,在绘制子对象时将使用子数据模板。请注意,所有数据模板都没有键,它们是在对象类型上设置键的。这就是我拥有的我有一个observableCollection父级在父级下我有一个observableCollection子级。我想让孩子们展示与父母不同的东西,但我似乎无法让它发挥作用。知道吗?基本上是c语言,我有父[0];父项[0]。任务;父[0]。子[0]。开始时间;父[0]。子[0]。结束时间;因此,在上面,我试图用客户机名称和与之关联的任务显示初始treelistview。显示的子对象将显示该任务的开始时间和结束时间。哦,我忘了说父对象可观察集合是信息。并且子级是一个类型细节,例如observablecollection父级=新observablecollection;observablecollection子项=新的observablecollection;我在做树视图,不是树视图。树列表视图是一个有很多列的视图,而不是像treeview那样只有一列。由于某些原因,我仍然无法使其正常工作。如果您正在创建自己的控件,该控件的父控件和子控件具有相同的列,则父控件和子控件上必须具有相同的字段。或者你想为父母和孩子们写不同的专栏?我有两门课。有一类叫做信息。一个名为Detail的类有三个不同的列。一个saids客户端、任务、描述。在这些项下,父项将按客户端、任务和描述命名。对于每个客户机,在客户机下都有一个子机,在任务下会显示“开始时间”,在描述下会显示“结束时间”,在描述下会显示“总小时”
<HierarchicalDataTemplate
DataType="{x:Type local:Assignment}"
ItemsSource="{Binding Path=AssignmentCollection}">
<Grid>
<TextBlock
x:Name="parentTextBox">
<TextBlock.Text>
<MultiBinding
StringFormat="{}{0} - {1} - {2:F2}">
<Binding
Path="ClientName" />
<Binding
Path="Task" />
<Binding
Path="Hours" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<TextBlock
x:Name="childTextBox" Visibility="Collapsed">
<TextBlock.Text>
<MultiBinding
StringFormat="{}{0:hh:mm tt} - {1:hh:mm tt} /{2}">
<Binding
Path="StartTime" />
<Binding
Path="EndTime" />
<Binding
Path="SubTask" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Grid>
<!--this is the trigger that chooses which text box to display-->
<HierarchicalDataTemplate.Triggers>
<DataTrigger
Binding="{Binding AssignmentCollection.Count}"
Value="0">
<Setter
TargetName="parentTextBox"
Property="Visibility"
Value="Collapsed" />
<Setter
TargetName="childTextBox"
Property="Visibility"
Value="Visible" />
</DataTrigger>
</HierarchicalDataTemplate.Triggers>
</HierarchicalDataTemplate>
<!--Child (detail) DataTemplate-->
<DataTemplate
DataType="{x:Type local:detail}">
<TextBox Text="{Binding Path=Some child binding}"/>
</DataTemplate>
<!--Parent (information) Hierarchical Template-->
<HierarchicalDataTemplate
DataType="{x:Type local:information}"
ItemsSource="{Binding Path=Child}">
<TextBox Text="{Binding Path=Some parent binding}"/>
</HierarchicalDataTemplate>