2012-03-17 4 views
3

WPF TreeViewにネストされたデータをバインドするために、HierarchicalDataTemplateを絶対的に単純に使用しようとしています。何らかの理由で、私の木の子は表示されません。ここでHierarchicalDataTemplateに子が表示されません。

                                                enter image description here

は全体でバツAML:データがNameから取得されます。データテンプレートは、実際のアイテムには適用されないことを

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

     var collection = new ObservableCollection<MyClass> 
     { 
      new MyClass { Name = "parent one" }, 
      new MyClass { Name = "parent two" }, 
     }; 
     collection[0].Children.Add(new MyClass { Name = "child one" }); 
     collection[0].Children.Add(new MyClass { Name = "child two" }); 
     ctTree.ItemsSource = collection; 
    } 
} 

class MyClass 
{ 
    public string Name { get; set; } 
    public ObservableCollection<MyClass> Children 
     = new ObservableCollection<MyClass>(); 
} 

注:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:src="clr-namespace:WpfApplication1" 
     Title="MainWindow" Height="350" Width="525"> 
    <TreeView Name="ctTree"> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType = "{x:Type src:MyClass}" 
             ItemsSource = "{Binding Path=Children}"> 
       <TextBlock Text="{Binding Path=Name}"/> 
      </HierarchicalDataTemplate> 
     </TreeView.Resources> 
    </TreeView> 
</Window> 

、ここではusingsと名前空間から離れて、この背後にあるのC#のすべてですテンプレートが適用されなかった場合、代わりに "MyClass"と表示されます。

子供はどのように見せますか? HierarchicalDataTemplateのすべての例とまったく同じことをしているようです。

答えて

6

MyClass.Childrenは、プロパティではなく、フィールドです。あなたは、その後、フィールドにバインドするプロパティにChildrenフィールドを変換し、すべてが動作するはずですができません。

class MyClass 
{ 
    public string Name { get; set; } 
    public ObservableCollection<MyClass> Children { get; private set; } 

    public MyClass() 
    { 
     Children = new ObservableCollection<MyClass>(); 
    } 
} 
+1

もちろんです!私はこれまで "通常の"バインディングを見てきました。ちょうど1つの質問:私はどのように私が台無しにしたか教えて私の例外は何ですか?私はそれがそうであるように静かに失敗しないことを望む... –

+1

"私はちょうどそれが動作することをテストしたが、"あなたは6分で答えを受け入れることができます "。ありがとうございます。 –

+2

まあ、バインディングは何かが間違っていると、通常はかなり静かです。そのため、デバッグは非常に面倒です。バインドが正しく機能していないように見える場合、私の手順は通常次のとおりです。1)タイプミスがないかチェックします。 2)プロパティが本当に存在することを確認します。 3)DataContextが正しく設定され、期待値に設定されていることを確認します。 4)空のコンバーターをバインディングに追加し、その中にブレークポイントを設定して、何が起こっているかを確認します。 – max

-1

私はTreeview.Resourcesは、そのために間違った場所だと思います。テンプレートをTreeview.ItemTemplateに入れたいとします。

+0

必ずしも、ソースリストに変数型のオブジェクトが含まれている場合は、リソース内のテンプレートを定義し、それらを 'DataType'を介して暗黙的に適用することが望ましいでしょう。 –

関連する問題