Question

Je mis en place un ContentControl.DataTemplateSelector à mon désirée.
Je veux que, selon une commande ou autre, appelez ContentControl sélectionner à nouveau le modèle du sélecteur soit par XAML ou code.

Merci

Était-ce utile?

La solution

Je ne suis pas au courant d'une (non-kludgy) façon de le faire: la DataTemplateSelector est appelée lorsque WPF doit sélectionner le modèle, et c'est une décision unique dans la mesure où WPF est concerné. (Vous pouvez bidouille en faisant de WPF pense que le contenu a changé, par exemple en définissant le contenu à null, puis de nouveau - je pense que cela fonctionne, mais ne l'ai pas testé - mais cela est assez laid) S'il y a une belle façon de faire cela, je voudrais moi aussi être intéressé à savoir!

Cependant, il y a une autre façon de changer la façon dont le contenu est affiché que fait mise à jour en réponse aux changements de données, et qui est par déclencheurs. Vous pouvez utiliser DataTriggers dans votre collection de DataTemplate.Triggers pour afficher et masquer des éléments en fonction des données de contenu. Pour changer l'affichage complet, vous pouvez par exemple mettre en place deux rendus dans une grille, et utiliser des déclencheurs pour commander celui qui est visible. Vous pouvez même faire votre modèle de données un ContentControl et utiliser un déclencheur pour changer le ContentTemplate. Bien sûr, cela dépend des critères de changement du modèle étant des propriétés pouvant être liées, qui ne peuvent pas toujours être le cas.

Voici une brève discussion des sélecteurs contre déclenche , mais dans un contexte légèrement différent.

Autres conseils

à la fin du parti, je sais. =)

Face à ce problème, je l'ai trouvé plus facile de définir explicitement une nouvelle TemplateSelector comme

MyContentControl.ContentTemplateSelector =
     new MyDataTemplateSelector();

Je suppose que je suis encore plus tard à la fête, mais pour une autre idée qui peut aider quelqu'un ...

Vous pouvez également essayer d'utiliser un ValueConverter sur les ContentControls ContentTemplate propriété au lieu d'un DataTemplateSelector.

Juste une propriété dans votre DataContext à lier, comme ScreenNumber par exemple. Ensuite, dans le ValueConverter retourner le DataTemplate qui est associé à la ScreenNumber.

Exemple ValueConverter:

public class ValueDataTemplateConverter : IValueConverter
{
    public DataTemplate TemplateA { get; set; }
    public DataTemplate TemplateB { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is ValueType valueType)
            switch (valueType)
            {
                case ValueType.TypeA:
                    return TemplateA;
                case ValueType.TypeB:
                    return TemplateB;
             }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

ressource Exemple XAML:

<converters:ValueDataTemplateConverter x:Key="ValueDataTemplateConverter">
    <converters:ValueDataTemplateConverter.TemplateA>
        <DataTemplate>
            <TextBox Text="{Binding Value}" />
        </DataTemplate>
    </converters:ValueDataTemplateConverter.TemplateA>
    <converters:ValueDataTemplateConverter.TemplateB>
        <DataTemplate>
            <CheckBox IsChecked="{Binding Value}" />
        </DataTemplate>
    </converters:ValueDataTemplateConverter.TemplateB>
</converters:ValueDataTemplateConverter>

Tout comme Jens réponse, au lieu de créer une nouvelle instance, vous pouvez utiliser l'instance existante du DataTemplateSelector.

var currentSelector = MyContentControl.ContentTemplateSelector;     
MyContentControl.ContentTemplateSelector = null;
MyContentControl.ContentTemplateSelector = currentSelector;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top