2014-09-05 3 views
2

연결, 데이터베이스, 테이블 등을 관리하는 응용 프로그램을 구축 중입니다. 여러 하위 컬렉션으로 항목 모음을 바인딩해야합니다 (아래 참조). 난 꽤 WPF에 새로운 오전 및이 질문에 대한 응답이 이미 있는지 확실하지 않은 경우. 검색했지만 찾은 시나리오의 예는 발견하지 못했습니다.WPF TreeView 여러 개의 하위 컬렉션 바인딩

server1 
-database1 
--functions <- "static" node 
---function1 
---function2 
--users <- "static" node 
---user1 
---user2 
-database2 
--functions <- "static" node 
---function3 
---function4 
--users <- "static" node 
---user3 
---user4 

데이터를 바인딩하려고 할 때 데이터를 표시 할 수 있지만 위의 형식이 아닙니다. 이렇게 표시됩니다.

server1 
-database1 
--function1 
--function2 
--user1 
--user2 

객체 계층 구조 :

class DatabaseViewModel 
{ 
    public string Name 
    { 
     // normal getters and setters for 2way binding 
    } 
    public IObservableCollection<DbFunctionViewModel> Functions 
    { 
     // normal getters and setters for 2way binding 
    } 
    public IObservableCollection<DbUserViewModel> Users 
    { 
     // normal getters and setters for 2way binding 
    } 
} 

마크 업 :

<TreeView x:Name="Connections"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type viewModels:DbConnectionViewModel}" ItemsSource="{Binding Databases}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock x:Name="Name" Text="{Binding Name}" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 
     <HierarchicalDataTemplate DataType="{x:Type viewModels:DbDatabaseViewModel}" ItemsSource="{Binding Children}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock x:Name="Name" Text="{Binding Name}" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 
     <HierarchicalDataTemplate DataType="{x:Type viewModels:DbFunctionViewModel}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock x:Name="Name" Text="{Binding Name}" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 
     <HierarchicalDataTemplate DataType="{x:Type viewModels:DbUserViewModel}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock x:Name="Name" Text="{Binding UserName}" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 

내가 모두를 포함하는 CompositeCollection를 반환 시도하고 내가 뭔가에 필요한 방법을 작동하지 않았다.

public IList Children 
{ 
    get 
    { 
     return new CompositeCollection 
     { 
      new CollectionContainer { Collection = Functions }, 
      new CollectionContainer { Collection = Users } 
     }; 
    } 
} 

제 질문은 어떻게 users 노드와 모든 기능을 node 노드에 bind합니까? 모든 조언을 크게 주시면 감사하겠습니다. 감사!

+0

귀하가 진술 한 문제를 해결 한 경우 답변을 수락 된 것으로 표시 할 수 있습니까? 이렇게하면 "답이없는 질문"목록을 깨끗하게 유지하는 데 도움이됩니다.) –

답변

0

마지막으로이 복잡한 바인딩 시나리오에 대한 해결책을 찾았습니다. Aaron Daisley-Harrison에는이 정확한 상황에 대한 프레임 워크와이 유형의 계층 적 데이터 바인딩을위한 complex data template이 있습니다.

1

Children 속성이 작동하도록하려면 CollectionContainer에 대한 데이터 템플릿을 정의해야합니다

public IList Children 
{ 
    get 
    { 
     return new[] 
     { 
      new CollectionContainer("Functions", Functions), 
      new CollectionContainer("Users", Users), 
     }; 
    } 
} 

몇 가지 힌트 :

<HierarchicalDataTemplate DataType="{x:Type viewModels:CollectionContainer}" 
          ItemsSource="{Binding Collection}"> 
    <TextBlock Text="{Binding Name}"/> 
</HierarchicalDataTemplate> 

당신은 string Name 재산 CollectionContainer을 추가해야

  1. 스택 패널은 중복됩니다.
  2. x:NameText={Binding ...}을 사용하여 바인딩하는 경우 중복됩니다.
+0

'CollectionContainer'의 데이터 템플릿은 무엇입니까? CollectionContainer의 배열에 의해 새로운 복합 컬렉션을 만들 필요가없는 것처럼 보입니다. – pushpraj

+0

잘 CompositeCollection은 .NET 프레임 워크의 일부입니다. 내가 가지고있는 이유는 그것이 누군가가 여러 컬렉션 유형을 묶는 것에 관한 글 이었기 때문입니다. –

+0

@athari에 동의합니다. 바인딩이 중복됩니다. 나는 그것이 작동하도록 다른 것들을 시도하고있었습니다. 다른 한편으로는 stackpanel을 사용하여 적절히 표시되는 것으로 보았던 stackpanel 내부의 문제 (이미지, 카운트)와 관련없는 다른 항목이 있습니다. 그러나 나는 게시물의 범위에서 동의한다. –

관련 문제