2

ObservableCollectionを含むSceneNodeクラスがあります。ツリー全体を表示したいのですが、これをデータバインディングで機能させることができないようです。ツリーアイテムにルートを追加するだけで、すべてが完全に機能します。

class SceneNode
{
    public string Name {get;set;}
    public ObserveableCollection<SceneNode> ChildrenNodes{get;set;}
    ....
}
class Scene
{
    public SceneNode Nodes{get;set;}
}

シーンをTreesデータコンテキストにバインドします。以下は私のtreesxamlです。

<TreeView MinHeight="250" ItemsSource={Binding Path=Nodes} >
    <TreeView.ItemTemplate>
                <HierarchicalDataTemplate DataType="{x:Type local:SceneNode}" ItemsSource="{Binding Path=ChildSceneNodes, UpdateSourceTrigger=PropertyChanged}">
                    <TextBlock Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}" Margin="0,10,0,10" />
                </HierarchicalDataTemplate>                
            </TreeView.ItemTemplate>
</TreeView> 

ツリーのコントロールが表示される前の舞台裏で、データコンテキストをバインドします

sceneTree.Tree.DataContext = theScene;

何も表示されませんが、データをバインドする代わりに私が行う場合

sceneTree.Tree.Items.Add( theScene.Nodes );

ツリーが表示され、ノードを追加および削除できます。このアクティビティはTreeViewに反映されます。

4

1 に答える 1

0

ここでの問題は、ItemsSource プロパティがコレクションを受け取り、コレクションではない SceneNode へのバインディングを作成していることです。この問題は、ChildrenNodes プロパティにバインドすることで解決されます。

    <TreeView x:Name="treeView" MinHeight="250" ItemsSource="{Binding Nodes.ChildrenNodes}" >
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate DataType="{x:Type WpfBackgroundWorkerQuestion:SceneNode}" ItemsSource="{Binding Path=ChildrenNodes, UpdateSourceTrigger=PropertyChanged}">
                <TextBlock Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}" Margin="0,10,0,10" />
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
于 2012-09-07T19:55:12.737 に答える