0

を使用して表示したいオブジェクトがいくつかありますTreeView。私が使用するクラスは次のように定義されています。

public abstract class QueryPart
{
    private static Random _random;
    protected static Random Random { get { return _random??(_random=new Random(654)); } }
    public string Name { get; set; }
    public QueryPart()
    {
        this.Name = this.GetType().Name + " " + Random.Next();
    }       
}

public abstract class Criterium : QueryPart
{        
    object ParamValue { get; set; }
    protected Criterium()
    {
        ParamValue = Random.Next();
    }
}

public sealed class Criterium<T> : QueryPart
{             
}

public abstract class CriteriumGroup : QueryPart
{
    public ObservableCollection<QueryPart> Childeren { get; private set; }
    public CriteriumGroup()
    {
        Childeren = new ObservableCollection<QueryPart>();
    }
}

public sealed class CriteriumGroup<T> : CriteriumGroup
{        
}

public static class Helper
{
    public static CriteriumGroup<T> GetDefaultCriteriumGroup<T>()
    {
        var master = new CriteriumGroup<T>();
        master.Childeren.Add(new Criterium<T>());
        var sub = new CriteriumGroup<T>()
        {
            Childeren =
                {
                    new Criterium<T>(),
                    new Criterium<T>(),
                    new Criterium<T>(),
                    new CriteriumGroup<T>() 
                    {
                        Childeren =
                        {
                            new Criterium<T>(), 
                            new Criterium<T>(), 
                            new Criterium<T>()
                        }
                    },
                    new Criterium<T>()
                }
        };
        master.Childeren.Add(sub);
        sub = new CriteriumGroup<T>()
        {
            Childeren =
                {
                    new Criterium<T>(),
                    new CriteriumGroup<T>() 
                    {
                        Childeren =
                        {
                            new Criterium<T>(), 
                            new Criterium<T>(), 
                            new Criterium<T>()
                        }
                    },
                }
        };
        master.Childeren.Add(sub);
        return master;
    }
}

TreeViewをのインスタンスにバインドしCriteriumGroup<T>、 を使用しHierarchicalDataTemplateます。問題は、私はそれを正しく理解できないようです - myTreeView.Items.Countは常に0です。

これは私がこれまでに持っているものです:

<TreeView x:Name="treeview" ItemsSource="{Binding Path=RootCriteriumGroup}">
        <TreeView.Resources>
            <DataTemplate DataType="{x:Type DynamicLinq:QueryPart}">
                <local:QueryPartModelView2/>
            </DataTemplate>

            <HierarchicalDataTemplate DataType="{x:Type DynamicLinq:Criterium}" ItemsSource={Binding Path=Childeren}>
                <local:QueryPartModelView2/>
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate 
                              DataType="{x:Type DynamicLinq:CriteriumGroup}" 
                              ItemsSource="{Binding Path=Childeren}">
                <local:QueryPartModelView2/>
            </HierarchicalDataTemplate>
        </TreeView.Resources>
    </TreeView>

私は何を間違っていますか?

4

1 に答える 1

0

このようなアプローチを取ることはうまくいきます:

<TreeView Name="treeView1" ItemsSource="{Binding MyEnumerableProperty}" >
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}" >
            <StackPanel Orientation="Horizontal">
                <Image Source="{Binding MyImageUri}"  />
                <TextBlock x:Name="someName" Text="{Binding MyNodeText}" />
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

これは簡単な開始方法です。機能するようになったら、物事を移動して、リソースセクションのスタイルとテンプレートとして使用できます。

于 2011-05-05T09:05:39.053 に答える