2009-11-17 52 views
0

我想做一个树列表视图,显示不同的信息相比,父。分层数据结构WPF TreeListView DataTriggers

从我现在的情况来看,孩子们显示的信息与父母相同。我想知道,我会如何做到这一点。我的最后一篇文章对我来说并不是很有意义,但效果并不理想。我想知道是否有人能够更深入地解释这一点。

这是最后一篇:

Hierarchical Data Structure WPF TreeListView

<r:TreeListView x:Name="TimeSheetsTreeListView" Margin="0,-18.312,0,0" 
       Style="{DynamicResource TreelistStyle}" Width="Auto" MinHeight="150" 
       Grid.Row="0" Background="#00FFFFFF" 
       ItemsSource="{Binding TimeSheetItems, Mode=Default}" 
       HorizontalContentAlignment="Center" 
       VerticalAlignment="Top" Height="207.446" Foreground="White" 
       Grid:GridViewSort.AutoSort="True" > 
    <r:TreeListView.Columns>   
     <GridViewColumn DisplayMemberBinding="{Binding ClientMatterName}" Width="200" 
         Grid:GridViewSort.PropertyName="ClientMatterName" > 
      <GridViewColumnHeader HorizontalContentAlignment="Center" Foreground="White" 
            Content="Client Name/Matter Name" 
            Grid:GridViewSort.PropertyName="ClientMatterName" 
     </GridViewColumn>    
     <GridViewColumn DisplayMemberBinding="{Binding ClientMatterCode}" Width="200" 
         Grid:GridViewSort.PropertyName="ClientMatterCode" > 
     <GridViewColumnHeader HorizontalContentAlignment="Center" Foreground="White" 
            Content="Client No./Matter No." FontSize="10.667"/> 
     </GridViewColumn> 
     <GridViewColumn DisplayMemberBinding="{Binding TimeCode.Code}" Width="100" 
         Grid:GridViewSort.PropertyName="TimeCodeCode" > 
      <GridViewColumnHeader HorizontalContentAlignment="Center" Foreground="White" 
            Content="Time Code" FontSize="10.667"/> 
     </GridViewColumn> 
     <GridViewColumn Header="Hours" Width="100" Grid:GridViewSort.PropertyName="Hours"> 
      <GridViewColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock HorizontalAlignment="Left" 
           Text="{Binding Duration, Converter={StaticResource BillableHoursConverter}}" /> 
       </DataTemplate> 
      </GridViewColumn.CellTemplate>   
     </GridViewColumn> 
     <GridViewColumn Width="300" DisplayMemberBinding="{Binding Description}" 
         Grid:GridViewSort.PropertyName="Description"> 
      <GridViewColumnHeader HorizontalContentAlignment="Center" Foreground="White" 
            Content="Description" FontSize="10.667"/> 
     </GridViewColumn> 
    </r:TreeListView.Columns> 
    <r:TreeListView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type data:TimeSheet}" 
            ItemsSource="{Binding Path= TimeRecords}"/> 
    </r:TreeListView.Resources> 
</r:TreeListView> 

回答

0

您的问题从事实,即你的父母和孩子都是相同类型的茎。两者都使用相同的模板,这里需要的是分层的数据结构。

如果你有一个父任务,有一个孩子的集合和孩子是不同于父母的类型,那么你会很酷。 (因为你可以为孩子们比母体不同的模板)

其他的方式做到这一点是要建立一个视图模型,有两种不同类型的,一个任务概述和一个子任务。

然而,我发现基于集合大小(当count为0时,我假设它是一个叶节点)使用触发器的解决方案一个更好的方法将是在对象上有一个属性指出它是哪种类型,父母或孩子,您可以轻松地使用视图模型进行操作,也可以将该属性放在业务对象上。 go here并下载TreeViewTest.zip示例解决方案。

上述项目不是理想的解决方案。我每次创建视图模型。它给你灵活性和控制力,超越你在直接wpf中所拥有的。

项目包含此代码是很棘手位(注意,绑定字符串格式,他们是真的很酷)

 <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> 
+0

这就是我所拥有的 我有一个observableCollection父 父母下我有一个可观察的收集儿童。 我想让孩子们展示比父母不同的东西,但我似乎无法得到那个工作。 有什么想法? – Kevin 2009-11-18 22:24:38

+0

所以它基本上在c# 我有 亲[0] .clientName; parent [0] .Task; parent [0] .child [0] .StartTime; parent [0] .child [0] .EndTime; 所以在上面,我试图显示与客户端名称和任务相关的初始treelistview 。 显示的孩子将显示该任务的开始时间和结束时间。 – Kevin 2009-11-18 22:26:55

+0

哦,我忘了说 父可观察收集是信息。 和孩子是一个类型的细节 如 observablecollection parent = new ObservableCollection ; observablecollection child = new ObservableCollection ; – Kevin 2009-11-18 22:48:05

2

,如果你想显示在一个TreeView的父子关系。 (只有一层深度,所以孩子们都是叶节点)。您将树视图绑定到父元素的集合。那么你做家长的分层数据模板,并为孩子

在你给你的对象类型信息与孩子的集合父的例子标准数据模板对象类型详细和父详细(孩子)的集合称为孩子

所以我们做了孩子的模板,然后一个父

<!--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> 

因为父母和孩子都是不同的对象类型,树形视图将抓住父模板,其中有一个项目来源,当谈到画孩子们来说,将使用日子数据模板。注无模板具有密钥的数据,它们是有方向性的对他们的对象类型。

+0

我正在做一个treeListView,而不是一个treeview。树列表视图是一个有很多列的视图,而不仅仅是像treeview这样的单个列。出于某种原因,我仍然无法完成这项工作。 – Kevin 2009-11-19 20:11:09

+0

如果您正在创建自己的控件,该控件具有父级和子级的相同列,那么您必须在父级和子级上具有相同的字段。还是你想为父母和孩子做不同的专栏? – 2009-11-19 22:34:29

+0

我有两个班。 一类称为信息。 一类称为细节 我有三个不同的列。 一说客户,任务,说明。 在那些家长将根据客户,任务和描述命名。 对于每个客户端,你有一个孩子 下客户端它会说“开始时间” 下任务它会说结束时间 和下描述它会说总时数 – Kevin 2009-11-20 19:45:49