2010-08-25 13 views
2

Je veux un TreeView avec des cases à cocher et j'essaie de suivre this tutorial. Cependant, il crée tout son contenu pour le TreeView lors de l'exécution. J'ai un fichier XML que j'ai accessible en tant XmlDataProvider dans mon XAML:WPF, lire les données de XmlDataProvider en C#

<XmlDataProvider Source="XmlData/Versions.xml" XPath="//*[count(*)=0]" 
       x:Key="versionsXml" /> 

J'ai une classe de modèle de vue avec IsChecked et Name propriétés, et je veux l'utiliser pour représenter les noeuds dans mon XML:

<Versions> 
    <Version name="1.0"> 
    <Version name="1.0.001" /> 
    <Version name="1.0.002" /> 
    </Version> 
</Versions> 

Mon TreeView affichera les nœuds feuille (c.-à-d., 1.0.001 et 1.0.002) avec une case à cocher. Comment est-ce que je peux remplir mon TreeView avec pas directement le contenu XmlDataProvider, mais plutôt un List<MyViewModel>? Je peux créer une propriété dans mon DataContext qui renvoie un List<MyViewModel>, puis lier mon TreeView à cette propriété, mais je ne sais pas comment, dans un getter de propriété C#, lire dans les données XML du XmlDataProvider. Lorsque j'utilise TryFindResource et que le résultat object est converti en XmlDataProvider, les propriétés Document et Data sont null pour ma ressource versionsXml (définie dans <UserControl.Resources>).

Répondre

0

Après avoir lu this thread, je l'ai fait ce qui suit:

<XmlDataProvider Source="XmlData/Versions.xml" XPath="//*[count(*)=0]" 
       x:Key="versionsXml" IsInitialLoadEnabled="True" 
       IsAsynchronous="False" /> 

Ensuite, en C# pour accéder aux données depuis XmlDataProvider la propriété Data n'était plus nulle:

var versions = new List<MyViewModel>(); 
var dataProvider = TryFindResource("versionsXml") as XmlDataProvider; 
if (null == dataProvider) 
{ 
    return versions; 
} 
var nodes = dataProvider.Data as IEnumerable; 
if (null == nodes) 
{ 
    return versions; 
} 
foreach (XmlElement node in nodes) 
{ 
    ... 
}