c# - mvc - wpf binding viewmodel



Datatemplate d'arbre WPF selon le type d'élément (2)

Si votre ItemsSource est composée de différents types, vous pouvez simplement créer HierarchicalDataTemplates et ne pas assigner une clé x :. S'il n'y a pas d'attribut x: Key pour un DataTemplate , le framework utilisera ce DataTemplate lorsqu'il rencontrera le type et DataTemplate afficher visuellement (vous pouvez en lire plus sur les DataTemplates implicites ici ). Par exemple, si vous avez un type Cercle et un autre type Carré, vous aurez les modèles suivants dans vos ressources:

<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>

Ensuite, si votre TreeView rencontre l'un de ces types dans son ItemsSource , il utilisera le HierarchicalDataTemplate pour ce type spécifique.

Vous pouvez en savoir plus sur HierarchicalDataTemplates ici , et ce lien a un exemple de la façon dont ils sont utilisés dans un TreeView .

OU

Si vos éléments sont tous de même type et ne sont différenciés que par une propriété (telle que Type), vous devez utiliser un DataTemplateSelector . Voici un exemple simple de celui-ci:

codebehind:

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;
        }
}

Et 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>

Ensuite, dans votre TreeView , vous affectez simplement le sélecteur

<TreeView x:Name="Tree" ItemsSource="{Binding Shapes}" ItemTemplateSelector="{DynamicResource shapeSelector}"/>

https://src-bin.com

J'ai une application MVVM WPF avec un arbre contenant des données auto référencées, cette donnée est liée à l'arbre avec un convertisseur hiérarchique. (Comme dans l'exemple: http://www.telerik.com/help/wpf/radtreeview-how-to-bind-to-self-referencing-data.html )

Ces données incluent ID, ParentID, Text et Type (et plus).

Exemple de données:

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

Maintenant, j'aimerais avoir différents modèles pour les Triangles, les Coeurs, les Cercles et les Carrés. Je ne veux pas dire seulement changer une image, mais vraiment un modèle. Comment puis-je accomplir cela?

Cordialement, Paul.


Answer #1

Si vous avez différents types réels, vous pouvez spécifier le type dans l'attribut HierarchicalDataTemplate en utilisant DataType ( Comment utiliser la propriété DataType sur un DataTemplate WPF? ) Et WPF sélectionnera le modèle basé sur la classe.

Si vous ne disposez pas de types différents, mais dépendez d'une propriété ou d'une valeur dans la classe, vous devez spécifier un DataTemplateSelector ( http://tech.pro/tutorial/807/wpf-tutorial-how-to- use-a-datatemplateselector )





mvvm