2009-10-04 9 views
1

Je travaille sur une solution PRISM/CAL, mais le problème peut être WPF spécifique:WPF - CAL - Plusieurs parents pour une seule instance de contrôle?

Si je crée une instance d'un contrôle (par exemple TextBlock) et l'ajouter comme enfant à un StackPanel, il n'y a pas moyen de ajoutez-le en tant que "enfant" à un autre StackPanel (parent déjà défini une erreur). Je comprends en quelque sorte la raison (cela se produit aussi lors de l'utilisation de RegionManager).

Mais quelle est la méthode suggérée si un contrôle visuel est très complexe et devrait être créé une seule fois et utilisé à deux endroits? Je suis d'accord qu'il n'est pas vraiment logique de montrer un contrôle identique 2 fois sur l'écran, mais il peut y avoir des cas où c'est utile (par exemple un bouton "Fermer tout").

Je sais que dans le cas du bouton, je devrais juste créer deux boutons à la fois databound à un ICommand. Mais cette règle s'applique également avec des contrôles beaucoup plus complexes (toujours créer de nouvelles instances) ...

Je suis tombé sur ce problème lors de la création d'un sélecteur de disposition, qui crée la liste des boutons et le panneau de pile pour chaque GUI séparément, mais utilise une ObservableCollection statique de boutons comme source (ce qui provoque des bogues étranges).

Des idées sur ce sujet?

Chris

Répondre

1

Ceci est normalement géré par les modèles. Autrement dit, vous extrayez les données dans un type particulier et associez un modèle à ce type. Ensuite, vous placez l'instance de cette donnée un certain nombre de fois dans votre arborescence visuelle et WPF la restitue avec le modèle. En bref, n'ajoutez pas de TextBlock à votre StackPanel. Au lieu de cela, ajoutez une instance de votre type de données (par exemple Customer) et associez un DataTemplate au type Customer. Il n'y a aucun moyen de parent la même UIElement dans plusieurs endroits.

+0

Merci, je le pensais ... Je travaille actuellement avec le code seulement (encore plus rapide, pas utilisé pour XAML et dans les envois multi-cibles avec Silverlight son malpropre de toute façon) .. Changé la collection ICommands et utilisé "nouveau "des boutons pour tous les contrôles. Alors tout va bien .. –

0

Vous pouvez ajouter votre contrôle (ou collection de contrôles) en tant que ressource et y faire référence via la liaison dans vos contrôles. Cela créera implicitement une copie (ils seront Freezable et WPF les copiera).

En général, vous devriez utiliser DataTemplates comme Kent le suggère, mais si vous avez un cas particulier, cela fonctionnera probablement.

Questions connexes