【问题标题】:Hierarchical Data Structure WPF TreeListView DataTriggers分层数据结构 WPF TreeListView DataTriggers
【发布时间】:2009-11-17 22:11:41
【问题描述】:

我正在尝试创建一个树列表视图,显示与父级相比不同的信息。

根据我现在的情况,子项显示与父项相同的信息。我想知道,我该怎么做。我的最后一篇文章对我来说并不是很有意义,它并没有很好地工作。我想知道是否有人可以为我更深入地解释一下。

这是最后一篇文章:

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>

【问题讨论】:

    标签: c# wpf xaml treeview


    【解决方案1】:

    如果您想在树视图中显示父子关系。 (只有一层深,所以孩子都是叶子节点)。您将树视图绑定到父元素的集合。然后你为父做一个分层数据模板,为孩子做一个标准数据模板

    在您给您的示例中,您有一个对象类型 information 的父对象,其中包含子对象类型 detaildetail 的集合父级上的 (children) 称为 child

    所以我们为孩子做一个模板,然后为父母做一个模板

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

    因为父和子是不同的对象类型,所以树视图会抓取父模板,它有一个项目源,在绘制子时它会使用子数据模板。请注意,所有数据模板都没有键,它们的键是对象类型。

    【讨论】:

    • 我正在做一个treeListView,而不是一个treeview。树列表视图是具有很多列的视图,而不仅仅是像树视图那样的单个列。由于某种原因,我仍然无法正常工作。
    • 如果您正在创建自己的控件,该控件具有相同的父项和子项列,那么您必须在父项和子项上具有相同的字段。还是你想为父母和孩子做不同的专栏?
    • 我有两节课。一类称为信息。一类称为 Detail 我有三个不同的列。一个说客户、任务、描述。在这些下,父级将由客户、任务和描述命名。对于每个客户,您在客户下都有一个孩子,它会在任务下说“开始时间”,它会说结束时间,在描述下它会说总小时数
    【解决方案2】:

    您的问题源于您的父母和孩子都是同一类型的事实。两者使用相同的模板,您需要的是分层的数据结构。

    如果您有一个包含一组子项的父任务,并且子项与父项的类型不同,那么您会很酷。 (因为您可以为孩子提供与父母不同的模板)

    另一种方法是构建一个视图模型,具有两种不同的类型,一种用于任务概述,一种用于子任务。

    但是我发现了一个使用基于集合大小的触发器的破解解决方案(当计数为 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>
    

    【讨论】:

    • 这就是我所拥有的我在父级下有一个 observableCollection Parent 我有一个 observable Collection Children。我想让孩子们展示与父母不同的东西,但我似乎无法让它发挥作用。有什么想法吗?
    • 所以它基本上在 c# 我有 parent[0].clientName;父[0].任务;父[0].child[0].StartTime;父[0].child[0].EndTime;所以在上面,我试图用客户端名称和与之关联的任务显示初始树列表视图。显示的子项将显示该任务的开始时间和结束时间。
    • 哦,还有,我忘了说父可观察集合是信息。并且孩子是一个类型详细信息,例如 observablecollection parent = new ObservableCollection; observablecollection child = new ObservableCollection;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    相关资源
    最近更新 更多