2010-10-15 7 views
0

Je suis nouveau sur Silverlight 4 et j'ai du mal à googler celui-ci car je ne connais pas très bien la terminologie utilisée. Quelqu'un peut me diriger dans la bonne direction?Silverlight: lier une collection observable à différents contrôles usuels

J'ai une collection observable que je veux représenter dans une liste ItemsControl. Le type de la collection est une classe qui - par souci de simplicité - appelons PersonInfo. Chaque personinfo possède une propriété chaîne Nom et une collection observable phoneNumbers. Tout fonctionne correctement lorsque je demande à DataTemplate ItemsControl d'utiliser "UserControl1" pour visualiser les données - les liaisons fonctionnent.

Mon problème est que - pour cet exemple théorique - je veux baser le contrôle utilisé pour afficher le PersonInfo sur certaines valeurs dans la propriété Name. Donc, je veux utiliser UserControl1 pour toutes les entrées nommées "Joe", et utiliser UserControl2 pour tous les autres. J'ai trouvé des trucs IValueConverter, mais cela ne semble pas aider à sélectionner le type de contrôle utilisé pour visualiser les données.

Sidenote: données montrent Usercontrol1 et Usercontrol2 de manière similaire, mais il y a quelques différences dans leurs mises en page de réseau complexes qui m'a forcé à créer 2 usercontrols séparés. Si quelqu'un sait comment je pourrais construire plusieurs mises en page dans xaml de UserControl1 et passer ensuite entre elles à l'exécution via une liaison de propriété, cela me permettrait probablement de contourner ce problème ...

Quelqu'un peut-il recommander une stratégie générale pour résoudre les deux côtés de ce problème?

Merci d'avance!

Répondre

0

J'ai résolu un dilemme similaire en utilisant un IValueConverter d'une manière inhabituelle: J'ai créé un "VisibilityConverter" qui indique à un contrôle s'il doit apparaître. Dans le cas de votre exemple, vous auriez deux d'entre eux: une méthode Convert serait

return ((PersonInfo)o).Name == "Joe" ? Visibility.Visible : Visibility.Collapsed; 

et l'autre ferait l'opposé. Puis lier la visibilité de UserControl1 à l'un VisibilityConverter et lier la visibilité de UserControl2 à l'autre et à la viole, ils s'échangent sur la base des données.

+0

Merci pour la réponse! C'est drôle que tu sois arrivé à cette conclusion aussi. J'ai fini par suivre cette voie avant de poster cette question - je me suis dit qu'il devait y avoir une solution qui me permette d'échanger ces choses plus facilement. J'ai utilisé un seul convertisseur de valeur qui acceptait un paramètre de liaison pour savoir quel contrôle l'avait appelé, mais j'aime mieux votre approche de validateur séparé. Je suis content de savoir que je n'étais pas complètement hors de la base! Merci encore – Landstander

Questions connexes