1

次のようなツリービューを作成したいと思います。

People
Person 1
    Relatives
        Relative 1
        Relative 2
    Mom
    Dad
    Pets
        Pet 1
        Pet 2

問題は、人が 2 つのリスト (親戚とペット) と 2 つの単一アイテム (ママとパパ) を持っていることです。HierarchicalDataTemplates にはかなり精通していますが、これを行う方法がわかりません。多くの例がありますが、このような型が混在しているようには見えません。

さらに興味深いことに、お母さんやお父さんがいない人がいるかもしれません (悲しいですが本当です)。リストはこれを反映する必要があります。

私が使用しているデータは、エンティティ フレームワークを使用したデータベースに由来するため、私のリストには既に正しい構造があります。また、すべてのオブジェクトを共通の複合オブジェクト (多くの例でも) から派生させたくありません。 「名前」と「子供」があります。データ テンプレートのバインディングでも、MomsFirstName、PersonsName など、各オブジェクトの自然なプロパティを使用したいと考えています。

これは可能ですか?

4

2 に答える 2

0

これが役立つかどうかはわかりませんが、独自のテンプレート セレクターを指定して、タイプごとに異なるテンプレートを選択することができます。それらはすべて、選択した ItemsPanelTemplate オブジェクトによってカプセル化されますが、指定したタイプに対して非常に異なるコントロールを持つことができます。これは私の使用例ですが、同じアイデアを TreeView に適用できると思います

 <ItemsControl>
    <ItemsControl.Resources>
        <DataTemplate x:Key="templateFoo">
        </DataTemplate>

        <DataTemplate x:Key="templateBar">
        </DataTemplate>

        <DataTemplate x:Key="templateJoe">
        </DataTemplate>
    </ItemsControl.Resources>

    <ItemsControl.ItemTemplateSelector>
        <local:MyTemplateSelector></local:MyTemplateSelector>
    </ItemsControl.ItemTemplateSelector>

    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="Grid.Row"
                Value="{Binding Row}" />
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>

そして、これはどこかで

public class MyTemplateSelector: DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;

        if (element == null || item == null)
            return null;

        if(item is Foo)
        {
            return element.FindResource("templateFoo") as DataTemplate;
        }

        if (item is Bar)
        {
            return element.FindResource("templateBar") as DataTemplate;
        }

        if (item is Joe)
        {
            return element.FindResource("templateJeo") as DataTemplate;
        }

        return null;
    }
}
于 2013-02-28T20:08:11.167 に答える
0

ItemTemplate と ItemTemplateSelector を使用しようとしましたか?

于 2013-03-01T10:32:11.563 に答える