2013-07-19 1 views
4

나는 WPF에서 트 리뷰를 사용하여 다음과 같은 데이터 구조를 시각화하고 싶습니다 :WPF TreeView가 List의 모든 요소를 ​​표시하도록 DataTemplate을 설정하려면 어떻게해야합니까?

class MyDataContext 
{ 
    ICollectionView Outers {get;set;} 
    //... 
} 

class Outer 
{ 
    string Name {get;set;} 
    IEnumberable<Inner> Actions {get;set;} 
} 


class Inner 
{ 
    string Description {get;set;} 
    Command OnClick {get;set;} 
} 

이 지금까지 내 시도는 다음과 같습니다

<!-- DataContext is MyDataContext at this point --> 
<TreeView ItemsSource="{Binding Path=Outers}"> 
    <TreeView.Resources> 
     <DataTemplate DataType="{x:Type myns:Outer}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Path=Name}"/> 

       <TreeView ItemsSource="{Binding Path=Actions}" > 
        <DataTemplate DataType="{x:Type myns:Inner}"> 
         <Button Command={Binding Path=OnClick}> 
          <TextBlock Text="{Binding Path=Description}"/> 
         </Button> 
        </DataTemplate> 
       </TreeView> 
      </StackPanel> 
     </DataTemplate> 
    </TreeView.Resources> 
</TreeView> 

내가 얻을 수 있기 때문에이 액세스에 문제가있는 것처럼 그것은 솔기 InvalidOperationException 다음 :

Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead. 

나는 예외 (뿐만 아니라 과정없이 버튼)이 없습니다 내부 트 리뷰를 삭제합니다.

답변

1

TreeView와 함께 HierarchicalDataTemplate을 사용해보십시오.

HierarchicalDataTemplate

+0

나는 당신이 언급 한 웹 사이트를 살펴했지만, 여전히 나는 "외부와 같은 행에있는 버튼과 동작을 얻을 방법을 모른다 "요소. 이 페이지에 제시된 예제는 각 버튼을 "외부"요소 아래의 새 행에 배치합니다. – Onur

0

어쩌면 이것은 당신에게 조금 도움)

XAML :

<TreeView ItemsSource="{Binding Outers}"> 
     <TreeView.ItemTemplate> 
      <DataTemplate> 
       <TreeViewItem ItemsSource="{Binding Actions}" Header="{Binding Name}"> 
        <TreeViewItem.ItemTemplate> 
         <DataTemplate> 
          <Button Command="{Binding Click}" Content="{Binding Name}" /> 
         </DataTemplate> 
        </TreeViewItem.ItemTemplate> 
       </TreeViewItem> 
      </DataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

데이터 :

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     DataContext = new MyDataContext(); 
    } 
} 



    class MyDataContext 
    { 
     public ObservableCollection<Outer> Outers { get; set; } 


     public MyDataContext() 
     { 
      Outers = new ObservableCollection<Outer>(); 
      Outers.Add(new Outer() { Name = "Herp" }); 
      Outers.Add(new Outer() { Name = "Derp" }); 
     } 
    } 

    class Outer 
    { 
     public string Name { get; set; } 
     public ObservableCollection<Inner> Actions { get; set; } 

     public Outer() 
     { 
      Actions = new ObservableCollection<Inner>(); 
      Actions.Add(new Inner { Name = "Test1" }); 
      Actions.Add(new Inner { Name = "Test2" }); 
      Actions.Add(new Inner { Name = "Test3" }); 
      Actions.Add(new Inner { Name = "Test4" }); 
      Actions.Add(new Inner { Name = "Test5" }); 
      Actions.Add(new Inner { Name = "Test6" }); 
      Actions.Add(new Inner { Name = "Test7" }); 
     } 
    } 


    class Inner 
    { 
     public string Name { get; set; } 
     public ICommand OnClick { get; set; } 
    } 

그리고 당신은 명령을 사용하는 경우 .. 다음 예를 시도해보십시오.(210) ICommand

6

나는이 질문에 대한 답을 읽은 후 마테우스이 언급 한 페이지 (HierarchicalDataTemplate) 및 사용 : Bind Collection to StackPanel 내가 원하는 것을 한 해결책을 발견 : 여기

선수 (레벨 3) 동일에있는 팀으로 행 (레벨 2) :

<TreeView ItemsSource="{Binding League}"> 
    <!-- Conference template --> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Teams}"> 
      <TextBlock Foreground="Red" Text="{Binding Name}" /> 
      <!-- Team template --> 
      <HierarchicalDataTemplate.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding Name}"/> 
         <ItemsControl ItemsSource="{Binding Players}"> 
          <ItemsControl.ItemsPanel> 
           <ItemsPanelTemplate> 
            <StackPanel Orientation="Horizontal"> 
            </StackPanel> 
           </ItemsPanelTemplate> 
          </ItemsControl.ItemsPanel> 
          <ItemsControl.ItemTemplate> 
           <DataTemplate> 
            <Button Content="{Binding }"/> 
           </DataTemplate> 
          </ItemsControl.ItemTemplate> 
         </ItemsControl> 
        </StackPanel> 
       </DataTemplate> 
      </HierarchicalDataTemplate.ItemTemplate> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

the result

관련 문제