2

自己参照データを含むツリーを備えたMVVMWPFアプリケーションがあります。このデータは、階層コンバーターを使用してツリーにバインドされています。(例のように:http ://www.telerik.com/help/wpf/radtreeview-how-to-bind-to-self-referencing-data.html )

このデータには、ID、ParentID、テキスト、タイプなどが含まれます。

データ例:

1,0,"FirstItem","Triangle"
2,1,"SubItem1","Circle"
3,1,"SubItem2","Square"
4,2,"SubItem11","Triangle"
5,2,"SubItem12","Heart"
6,3,"SubItem21","Circle"

ここで、三角形、ハート、円、正方形のさまざまなテンプレートが必要です。画像を変更するだけでなく、実際にはテンプレートを変更することを意味します。どうすればそのようなことを達成できますか?

よろしく、ポール。

4

2 に答える 2

5

が異なるタイプで構成されている場合ItemsSourceは、単純HierarchicalDataTemplatesに x:Key を作成して割り当てなくてもかまいません。の x:Key 属性がない場合DataTemplate、フレームワークはDataTemplate型に遭遇したときにこれを使用し、それを視覚的に表示しようとします (暗黙の詳細については、DataTemplates こちらを参照してください)。たとえば、タイプが Circle で別のタイプが Square の場合、リソースには次のテンプレートがあります。

<Window.Resources>
    <HierarchicalDataTemplate DataType="{x:Type local:Circle}" ItemsSource="{Binding Children}">
        <Ellipse Fill="{Binding Fill}" Width="25" Height="25" Stroke="Black" StrokeThickness="0.25"/>
    </HierarchicalDataTemplate>
    <HierarchicalDataTemplate DataType="{x:Type local:Square}" ItemsSource="{Binding Children}">
        <Rectangle Fill="{Binding Fill}" Width="25" Height="25" Stroke="Black" StrokeThickness="0.25"/>
    </HierarchicalDataTemplate>
</Window.Resources>

でこれらのタイプのいずれかにTreeView遭遇すると、その特定のタイプItemsSourceに が使用されます。HierarchicalDataTemplate

詳細についてはHierarchicalDataTemplates こちらをご覧ください。このリンクには、TreeView.

また

項目がすべて同じ Type で、プロパティ (Type など) によってのみ区別される場合は、DataTemplateSelector. 以下に簡単な例を示します。

コードビハインド:

public class ShapeTemplateSelector : DataTemplateSelector
{
    public DataTemplate CircleTemplate { get; set; }
    public DataTemplate SquareTemplate { get; set; }
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        Shape shape = item as Shape;
        if (shape != null)
        {
            if (shape.Type == "Circle")
                return this.CircleTemplate;
            else if (shape.Type == "Square")
                return this.SquareTemplate;
            }
            return null;
        }
}

XAML:

<local:ShapeTemplateSelector x:Key="shapeSelector">
    <local:ShapeTemplateSelector.CircleTemplate>
        <HierarchicalDataTemplate DataType="{x:Type local:Shape}" ItemsSource="{Binding Children}">
            <Ellipse Fill="{Binding Fill}" Width="25" Height="25" Stroke="Black" StrokeThickness="0.25"/>
        </HierarchicalDataTemplate>
    </local:ShapeTemplateSelector.CircleTemplate>
    <local:ShapeTemplateSelector.SquareTemplate>
        <HierarchicalDataTemplate DataType="{x:Type local:Shape}" ItemsSource="{Binding Children}">
            <Rectangle Fill="{Binding Fill}" Width="25" Height="25" Stroke="Black" StrokeThickness="0.25"/>
        </HierarchicalDataTemplate>
    </local:ShapeTemplateSelector.SquareTemplate>
</local:ShapeTemplateSelector>

次に、でTreeView、セレクターを割り当てるだけです

<TreeView x:Name="Tree" ItemsSource="{Binding Shapes}" ItemTemplateSelector="{DynamicResource shapeSelector}"/>
于 2013-03-11T16:51:54.600 に答える
0

実際に異なるタイプがある場合は、DataType 属性を使用して HierarchicalDataTemplate でタイプを指定できます ( How do I use the DataType property on a WPF DataTemplate? )。WPF はクラスに基づいてテンプレートを選択します。

異なる型はなく、クラス内のプロパティまたは値に依存する場合は、DataTemplateSelector ( http://tech.pro/tutorial/807/wpf-tutorial-how-to- use-a-datatemplateselector )

于 2013-03-11T16:30:49.940 に答える