1

ObservableCollections に基づく単純なツリー構造にバインドした WPF TreeView コントロールを使用しています。XAML は次のとおりです。


<TreeView Name="tree" Grid.Row="0"> 
    <TreeView.ItemTemplate> 
        <HierarchicalDataTemplate ItemsSource="{Binding Path=Children}"> 
            <TextBlock Text="{Binding Path=Text}"/> 
        </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView>  

そしてツリー構造:


public class Node : IEnumerable { 
    private string text; 
    private ObservableCollection<Node> children; 
    public string Text { get { return text; } } 
    public ObservableCollection<Node> Children { get { return children; } } 
    public Node(string text, params string[] items){ 
        this.text = text; 
        children = new ObservableCollection<Node>(); 
        foreach (string item in items) 
            children.Add(new Node(item)); 
    } 
    public IEnumerator GetEnumerator() { 
        for (int i = 0; i < children.Count; i++) 
            yield return children[i]; 
    } 
} 

このツリーの ItemsSource をツリー構造のルートに設定すると、その子はツリーのルート レベルのアイテムになります (必要に応じて)。


private Node root; 

root = new Node("Animals"); 
for(int i=0;i<3;i++) 
    root.Children.Add(new Node("Mammals", "Dogs", "Bears")); 
tree.ItemsSource = root; 

ツリー構造のさまざまな非ルート ノードに新しい子を追加すると、それらは TreeView の適切な場所に表示されます。

root.Children[0].Children.Add(new Node("Cats", "Lions", "Tigers"));  

しかし、ルート ノードに子を追加すると、次のようになります。

root.Children.Add(new Node("Lizards", "Skinks", "Geckos")); 

アイテムは表示されず、私が試したこと (ItemsSource を null に設定してから再度戻すなど) は何も表示されませんでした。

ItemsSource を設定する前にトカゲを追加すると表示されますが、後で追加すると表示されません。

猫は現れるが、トカゲは現れない

何か案は?

4

2 に答える 2

3

ItemsSource = root を設定していますが、これはたまたま IEnumerable を実装していますが、それ自体は観察可能ではありません。観察可能な Children プロパティがありますが、それは TreeView をバインドしているものではないため、TreeView には Children プロパティを介して発生する変更をリッスンする方法がありません。

Node クラスから IEnumerable を完全に削除します。次に、treeView.ItemsSource = root.Children; を設定します。

于 2010-01-26T10:00:09.860 に答える
2

「ルート」が ObservableCollection の場合、ツリービューが更新されます。「ルート」は監視可能なコレクションですか、それともルートは監視可能なコレクション内のノードですか? 項目ソースのバインディングを確認すると、この質問に答えるのに役立ちます。コードで割り当てているため、コレクションではなく単一の要素に設定している可能性があります

于 2009-12-14T02:31:32.543 に答える