2009-11-17 5 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

ваша проблема связана с тем, что оба ваши родители и дети имеют одинаковый тип. тот же шаблон используется для обоих, то, что вам нужно, это иерархическая структура данных.

Если у вас была родительская задача, у которой была коллекция детей, а дети были другого типа, чем у родителя, тогда вам будет здорово. (потому что вы могли бы предоставить другой шаблон для детей, чем родительский)

Другой способ сделать это - создать модель представления с двумя различными типами: одну для обзоров задач и одну для подзадач.

однако я нашел решение для взлома с использованием триггеров на основе размеров коллекции (когда число равно 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

Это то, что у меня есть У меня есть наблюдаемый родитель созвездия у родителя у меня есть наблюдаемая коллекция Children. Я хочу, чтобы дети отображали разные вещи, кроме родителя, но я не могу заставить их работать. Любая идея? – Kevin

+0

SO это в основном в C# У меня есть parent [0] .clientName; parent [0] .Task; parent [0] .child [0] .StartTime; parent [0] .child [0] .EndTime; поэтому в приведенном выше примере я пытаюсь отобразить начальное treelistview с именем клиента и связанной с ним задачей. Отображаемые дети будут отображать время начала и окончания этой задачи. – Kevin

+0

Ой, я забыл сказать Родительская наблюдаемая коллекция - это информация. , а ребенок - это тип детали , такой как наблюдаемый коллектив parent = new ObservableCollection ; наблюдаемый сбор ребенок = новый ObservableCollection ; – Kevin

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. представление списка деревьев - это список с большим количеством столбцов, а не только один столбец, подобный древовидной структуре. Я по-прежнему не могу заставить это работать по какой-то причине. – Kevin

+0

, если вы создаете свой собственный элемент управления, который имеет одинаковые столбцы для родителя и детей, тогда вы должны иметь те же поля родителя и детей. или вы пытаетесь сделать разные столбцы для родителей и детей? –

+0

У меня есть два класса. Один класс называется Information. Один класс под названием Detail У меня есть три разных столбца. Один сказал Клиент, задача, Описание. Под этими родителями будет указан клиент, задача и описание. Для каждого клиента у вас есть ребенок под клиентом он скажет «Время начала» под заданием скажет время окончания и под описанием будет указано общее количество часов – Kevin

Смежные вопросы