2010-04-18 5 views
2

Comment lier récursivement une vue arborescente à un XDocument, en mappant chaque élément XML en un nœud dans l'arborescence?Silverlight lie récursivement Treeview à XDocument

Le code ci-dessous devrait fonctionner de mon point de vue (et aussi selon les postes très peu que j'ai trouvé en ce qui concerne la liaison directe), mais il ne fonctionne pas:

<sdk:TreeView ItemsSource="{Binding Path=Elements}" DataContext="{Binding Path=Data}"> 
    <sdk:TreeView.ItemTemplate> 
    <data:HierarchicalDataTemplate ItemsSource="{Binding Path=Elements}"> 
    <StackPanel Orientation="Vertical"> 
    <TextBlock Text="{Binding Name}"/> 
    </StackPanel> 
    </data:HierarchicalDataTemplate> 
    </sdk:TreeView.ItemTemplate> 
</sdk:Treeview> 

(données est une propriété de type XElement sur la ai-je fait une erreur quelque part ou ai-je vraiment besoin d'implémenter un IValueConverter juste pour obtenir les éléments enfants d'un XElement?

Répondre

1

Le membre "Elements" n'est pas une propriété, c'est un appel de méthode.
Vous ne pouvez pas vous lier aux appels de méthode dans Silverlight.

Si vous voulez vraiment que ce scénario fonctionne, vous avez 2 options que je peux voir:
1. Utilisez un IValueConverter pour extraire le contenu de la méthode "Elements".
2. Envelopper le document XDocument dans les classes managées dans une hiérarchie appropriée. Personnellement, Bien que l'option n ° 1 semble la plus rapide, je crois qu'à long terme, il vous faudra plus de temps pour la maintenance et la prise en charge, puis passer 10 minutes supplémentaires à créer un modèle de domaine approprié.

Sincèrement,
- Justin Ange

+1

Justin, merci pour vos idées. Je crée un éditeur XML simple pour varier les schémas d'entrée, donc le XDocument est mon modèle de domaine - je ne vois pas l'avantage de créer/générer une réplique de code de chacun de mes schémas XML par opposition à "garder l'éditeur inconscient". [Modifier] Bien que je puisse essayer Linq2Xsd ... – wagi

+1

Michael, Vous n'avez pas besoin d'outils sophistiqués. Construisez simplement un wrapper de 3 propriétés simples autour des classes LinqToXml avec Name, Value et Children. C'est à peu près 10 lignes de code, et puis databind à cela. Faites-moi savoir si vous rencontrez des problèmes lors de la mise en œuvre de cette approche. – JustinAngel

+1

Un peu en retard, mais pour être complet: j'ai fini par faire exactement cela, je me suis écrit un wrapper (pas si mince) et j'ai aussi mis en place des méthodes et des propriétés pratiques. Merci! – wagi

Questions connexes