簡體   English   中英

分層數據結構WPF TreeListView DataTriggers

[英]Hierarchical Data Structure WPF TreeListView DataTriggers

我正在嘗試制作一個樹形列表視圖,以顯示與父視圖相比不同的信息。

從我現在的情況來看,孩子們顯示的信息與父母相同。 我想知道我該怎么做。 我寫的最后一篇帖子對我來說意義不大,效果不佳。 我想知道是否有人可以為我進一步解釋這一點。

這是最后一篇文章:

分層數據結構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>

如果要在樹視圖中顯示父子關系。 (僅深一層,因此子級都是葉節點)。 您將樹視圖綁定到父元素的集合。 然后為父級創建分層數據模板,為子級創建標准數據模板

在該示例中,您具有對象類型信息的父對象,該對象具有子對象對象類型詳細 信息的集合,父對象上的細節 (子對象)的集合稱為子對象

所以我們為孩子們做一個模板,然后為父母做一個模板

  <!--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時,我假設它是一個葉節點)使用觸發器的黑客解決方案,一種更好的方法是在對象上具有一個屬性,該屬性指出其類型,父或子,您可以使用視圖模型輕松完成某些操作,也可以將屬性放置在業務對象上。 請轉到此處並下載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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM