Question

J'ai un ItemsControl dont ItemsSource est lié à un ObservableCollection < Component > à l'exécution. J'ai défini un modèle de données pour le type de composant qui fonctionne bien.

Le composant possède maintenant une ObservableCollection <=> Control > et je veux ajouter un autre ItemsControl à l'intérieur de mon modèle de données de composant pour rendre tous les contrôles. Le contrôle ici est mon propre objet personnalisé non lié à un contrôle wpf.

Comme il existe différents types de contrôles, j'essaie d'utiliser un ItemTemplateSelector pour sélectionner le bon modèle pour chaque type. Dans l’exemple ci-dessous, pour ne pas trop encombrer, je n’ai montré qu’un des modèles & "RWString &"; que je trouve en utilisant un FindResource dans MyControlTemplateSelector écrasant SelectTemplate. Mais le SelectTemplate n'est jamais appelé (à l'aide d'un point d'arrêt à vérifier). Quelque chose ne va pas dans mon xaml?

<ItemsControl.Resources>
    <src:MyControlTemplateSelector x:Key="XSelector" />
    <DataTemplate DataType="{x:Type src:Component}"  >
        <Expander Visibility="{Binding Path=Show}">
                <ItemsControl ItemsSource="{Binding Path=Contrls}" 
                          ItemTemplateSelector="{StaticResource XSelector}">
                <ItemsControl.Resources>
                    <DataTemplate x:Key="RWstring" >
                        <TextBlock Text="{Binding Path=Label}"/>
                    </DataTemplate>
                </ItemsControl.Resources>
                <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate><WrapPanel /></ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </Expander>
    </DataTemplate>
</ItemsControl.Resources>

Mise à jour: Contrls n’est pas une faute de frappe, c’est juste moi qui utilise un système de nommage idiot. Contrls est une propriété de Component de type ObservableCollection. De plus, la raison pour laquelle j'essaie d'utiliser ItemsTemplateSelector est que ObservableCollection <=> Control & Gt; contient des objets de types génériques tels que Control <=> int > Contrôle <=> string & Gt; etc, tous dérivant de Control et apparemment, vous ne pouvez pas créer de modèles de données faisant référence à des types génériques.

Update3: La mise à jour 2 a été supprimée car elle n'était pas liée. ItemTemplateSelector fonctionne en modifiant StaticResource en DynamicResource. Mais je ne sais pas pourquoi ça marche ...

Était-ce utile?

La solution

J'imagine que cela ne fonctionne pas avec StaticResource car la ressource se trouve dans le contrôle ItemsControl, lequel n'a probablement pas été créé au moment du chargement lorsque StaticResources est évalué.

Les ressources dynamiques au moment du chargement sont évaluées comme une expression au moment du chargement, puis à la valeur correcte à la demande.

Essayez de déplacer la ressource en dehors du contrôle ItemsControl.

Autres conseils

Dans la ligne où vous liez le contrôle ItemsControl imbriqué, le chemin est-il correct? Il s’agit actuellement de & "Contrls &"; Devrait-il s'agir de & "Contrôles &"??

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top