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

이것은 내가 가지고있는 것입니다. 나는 observableCollection 부모를 가지고 있습니다. 부모 하위에 obserchableCollection 부모 이 있습니다. 관찰 가능한 Collection Children이 있습니다. 부모님과 다른 것들을 보여주고 싶지만 그렇게 할 수없는 것 같습니다. 아이디어가 있으십니까? – Kevin

+0

기본적으로 C 언어입니다. # 나는 가지고 있습니다 parent [0] .clientName; parent [0] .Task; parent [0] .child [0] .StartTime; parent [0] .child [0] .EndTime; 위와 같이 클라이언트 이름과 관련된 작업과 연관된 최초의 treelistview 을 표시하려고합니다. 표시되는 하위 항목에는 해당 작업의 시작 시간과 종료 시간이 표시됩니다. – Kevin

+0

아, 또한 말을 잊어 버렸습니다 부모가 관찰 가능한 컬렉션 정보입니다. 이고 자식은 과 같이 observablecollection과 같은 형식입니다. 부모 = 새 ObservableCollection ; observablecollection 하위 = 새 ObservableCollection ; – Kevin

2

(바인딩에 문자열 형식을 유의을, 그들은 정말 멋진). (깊이가 한 단계이므로 아이들은 모든 잎 노드입니다). 트리 뷰를 부모 요소 컬렉션에 바인딩합니다. 당신은 부모의 계층 적 데이터 템플릿, 당신은 당신이 아이들의 컬렉션 객체 유형 정보의 부모가주는 예제에서 아이

위한 표준 데이터 템플릿을 형에게 세부 객체와 부모에 세부 (어린이)의 컬렉션

그래서 우리는 부모

<!--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> 
01 다음 하나를 아이들을위한 템플릿을하고, 아이 라고

부모와 자식이 다른 객체 유형이므로 트리 뷰는 항목 소스가있는 부모 템플릿을 가져오고 자식을 그리려면 자식 데이터 템플릿을 사용합니다. 데이터 템플리트에는 키가 없는데, 객체 유형에 따라 키가 지정됩니다.

+0

트리 뷰가 아니라 treeviewView를하고 있습니다. 트리 목록보기는 트리보기와 같은 단일 열뿐만 아니라 많은 열이있는보기입니다. 나는 아직도 어떤 이유로이 일을 할 수 없다. – Kevin

+0

부모 및 자식에 대해 동일한 열이있는 자체 컨트롤을 만드는 경우 부모 및 자식에 대해 동일한 필드가 있어야합니다. 아니면 부모님과 아이들을 위해 다른 기둥을 만들려고하십니까? –

+0

두 클래스가 있습니다. 정보라는 한 클래스. 하나의 클래스가 호출 됨 Detail 세 개의 다른 열이 있습니다. 하나는 클라이언트, 작업, 설명입니다. 그 밑에 부모는 클라이언트, 업무 및 묘사에 의해 지명 될 것이다. 모든 클라이언트의 경우 클라이언트 아래에 "시작 시간"이라고 말한 작업 종료 시간은 종료 시간이 이고 설명 아래에 총 시간 – Kevin