2009-11-11 18 views
15

TreeViewノードの展開/折りたたみを、バインドされているオブジェクトを通して制御する方法を探してみようとしています。オブジェクトにはIsExpandedプロパティがあり、そのプロパティに基づいてTreeViewノード自体が展開または折りたたまれていることを示すために使用します。ここでWPF DataBoundツリービュー展開/折りたたみ

は私のコードです:

C#:

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

     this.DataContext = new List<Parent>() { Base.GetParent("Parent 1"), Base.GetParent("Parent 2") }; 
    } 
} 

public class Base 
{ 
    public string Name { get; set; } 
    public bool IsExpanded { get; set; } 

    public static Parent GetParent(string name) 
    { 
     Parent p = new Parent() { Name = name }; 

     p.Children.Add(new Child() { Name = "Child 1", GrandChildren = new ObservableCollection<GrandChild>() { new GrandChild() { Name = "Grandchild 1" } } }); 
     p.Children.Add(new Child() { Name = "Child 2", GrandChildren = new ObservableCollection<GrandChild>() { new GrandChild() { Name = "Grandchild 1" } } }); 
     p.Children.Add(new Child() { Name = "Child 3", GrandChildren = new ObservableCollection<GrandChild>() { new GrandChild() { Name = "Grandchild 1" } } }); 

     return p; 
    } 
} 

public class Parent : Base 
{ 
    public ObservableCollection<Child> Children { get; set; } 

    public Parent() 
    { 
     this.Children = new ObservableCollection<Child>(); 
    } 
} 

public class Child : Base 
{ 
    public ObservableCollection<GrandChild> GrandChildren { get; set; } 

    public Child() 
    { 
     this.GrandChildren = new ObservableCollection<GrandChild>(); 
    } 
} 

public class GrandChild : Base 
{ 
} 

XAML:

<Window x:Class="HeterogeneousExperimentExplorer.Window2" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:HeterogeneousTree" 
    Title="Window2" Height="300" Width="300"> 
    <Window.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type local:Parent}" ItemsSource="{Binding Children}"> 
      <TextBlock Text="{Binding Name}" /> 
      <HierarchicalDataTemplate.ItemTemplate> 
       <HierarchicalDataTemplate DataType="{x:Type local:Parent}" ItemsSource="{Binding GrandChildren}"> 
        <TextBlock Text="{Binding Name}" /> 
        <HierarchicalDataTemplate.ItemTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Name}" /> 
         </DataTemplate> 
        </HierarchicalDataTemplate.ItemTemplate> 
       </HierarchicalDataTemplate> 
      </HierarchicalDataTemplate.ItemTemplate> 
     </HierarchicalDataTemplate> 
    </Window.Resources> 
    <Grid> 
     <TreeView ItemsSource="{Binding}" /> 
    </Grid> 
</Window> 

答えて

40

は解決策を考え出しました。本当に簡単:

<Style TargetType="{x:Type TreeViewItem}"> 
     <Setter Property="IsExpanded" Value="{Binding IsNodeExpanded}"> 
     </Setter> 
    </Style> 

だから、スタイルはツリービューアイテムにバインドされたオブジェクトを取得し、そのIsNodeExpanded属性を見て、それがTreeViewItem.IsExpandedプロパティにその値を割り当てます。 Mode = TwoWayを追加すると、互いに通知されます(ツリービュー項目が展開されたときにオブジェクトに通知されます)。

ありがとうございます!

1

FWIWこれはCodeProject article by Josh Smithで、一般的な(nレベル)アプローチを使用してMVVMベースのツリービューを作成する方法を示しています。

私はCarloの実装に何か問題があるとは示唆していませんが、この記事はTreeViewコントロールとMVVMの一般的な理解に役立ちます。

関連する問題