[英]Hierarchical Data Structure WPF TreeListView DataTriggers
我正在嘗試制作一個樹形列表視圖,以顯示與父視圖相比不同的信息。
從我現在的情況來看,孩子們顯示的信息與父母相同。 我想知道我該怎么做。 我寫的最后一篇帖子對我來說意義不大,效果不佳。 我想知道是否有人可以為我進一步解釋這一點。
這是最后一篇文章:
<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.