Les deux sens de la liaison de données Xml à la WPF TreeView
Je tente de réécrire mon ForestPad application utilisant WPF pour la couche de présentation. En WinForms, je suis le remplissage de chaque nœud par programmation, mais je voudrais profiter de la liaison de données capacités de WPF, si possible.
En général, quelle est la meilleure façon de deux façon databind WPF Arborescence d'un document Xml?
Une solution générique est bien, mais pour la référence, la structure du document Xml que je suis en train d'essayer de se lier à ressemble à ceci:
<?xml version="1.0" encoding="utf-8"?>
<forestPad
guid="6c9325de-dfbe-4878-9d91-1a9f1a7696b0"
created="5/14/2004 1:05:10 AM"
updated="5/14/2004 1:07:41 AM">
<forest
name="A forest node"
guid="b441a196-7468-47c8-a010-7ff83429a37b"
created="01/01/2003 1:00:00 AM"
updated="5/14/2004 1:06:15 AM">
<data>
<![CDATA[A forest node
This is the text of the forest node.]]>
</data>
<tree
name="A tree node"
guid="768eae66-e9df-4999-b950-01fa9be1a5cf"
created="5/14/2004 1:05:38 AM"
updated="5/14/2004 1:06:11 AM">
<data>
<![CDATA[A tree node
This is the text of the tree node.]]>
</data>
<branch
name="A branch node"
guid="be4b0993-d4e4-4249-8aa5-fa9c940ae2be"
created="5/14/2004 1:06:00 AM"
updated="5/14/2004 1:06:24 AM">
<data>
<![CDATA[A branch node
This is the text of the branch node.]]></data>
<leaf
name="A leaf node"
guid="9c76ff4e-3ae2-450e-b1d2-232b687214aa"
created="5/14/2004 1:06:26 AM"
updated="5/14/2004 1:06:38 AM">
<data>
<![CDATA[A leaf node
This is the text of the leaf node.]]>
</data>
</leaf>
</branch>
</tree>
</forest>
</forestPad>
OriginalL'auteur Timothy Lee Russell | 2008-10-09
Vous devez vous connecter pour publier un commentaire.
Bien, il serait plus facile si votre élément de la hiérarchie était plus comme...
...plutôt que de votre schéma actuel.
Vous aurez besoin de 4
HierarchicalDataTemplate
s, un pour chaque hiérarchique de l'élément, y compris la racine, et unDataTemplate
pourleaf
éléments:Vous pouvez les remplacer par la
Source
de laXmlDataProvider
programme:Aussi, re-enregistrer vos modifications, est très simple:
La
TreeView
lui-même a besoin d'unName
et unItemsSource
collé à laXmlDataProvider
:J'cet exemple, je n'ai
TwoWay
liaison avecTextBox
es sur chaque nœud, mais quand il s'agit d'éditer un nœud à la fois dans un document distinct, uniqueTextBox
ou d'un autre contrôle, vous serait le lie à l'élément actuellement sélectionné de laTreeView
. Vous aussi, vous avez changer le ci-dessusTextBox
esTextBlock
s, en cliquant dans laTextBox
n'a pas pour effet de sélectionner le correspondantTreeViewItem
.La raison pour laquelle vous devez utiliser deux
Binding
s, c'est que vous ne pouvez pas utiliserPath
etXPath
ensemble.Edit:
Timothy Lee Russell a demandé à propos de l'enregistrement CDATA les éléments de données. Tout d'abord, un peu sur
InnerXml
etInnerText
.Derrière les coulisses,
XmlDataProvider
est à l'aide d'unXmlDocument
, avec l'arbre deXmlNodes
. Quand une chaîne telle que "trucs" est affectée à laInnerXml
propriété d'unXmlNode
, ces tags sont des balises. Pas d'échappement est réalisé lors de l'obtention ou de réglage deInnerXml
, et elle est analysée comme XML.Toutefois, si au contraire il est affecté à la
InnerText
de la propriété, les crochets seront échappés avec des entités < et >. L'inverse se produit lorsque la valeur est récupéré. Les entités (<) il est résolu à l'arrière dans les caractères (<).Par conséquent, si les chaînes que nous stockons dans les éléments de données contenant du XML, les entités ont été échappé, et nous avons besoin de défaire que de simplement en récupérant
InnerText
avant d'ajouter une section CDATA comme le nœud de l'enfant...Si le nœud a déjà une section CDATA, et la valeur n'a pas été modifié d'une quelconque façon, il a encore une section CDATA, et nous avons essentiellement le remplacer par le même. Cependant, par le biais de notre liaison, si l'on change la valeur des éléments de données de contenu, il remplace la CDATA en faveur d'un échappé de la chaîne. Ensuite, nous avons à résoudre.
Si il y a un document XML comme un string, elle s'échappe des crochets avec des entités (ils commencent par &). Ce qui peut être inversé car le Document propriété renvoie un XmlDocument. Je vais modifier et ajouter le code permettant de le faire CDATA dans les éléments de données.
Super, cela fonctionne. La performance est vraiment dommage pour la taille des documents que je suis en train de travailler avec, mais au lieu de la mise à jour de chaque nœud, je vais ajouter un IsDirty drapeau et de mettre à jour uniquement les nœuds qui ont été modifiés.
Aussi, je ne veux pas d'un nœud racine, donc j'ai changé l'expression XPath dans le ItemsSource de l'Arborescence de "XPath=forêt" au lieu de "XPath=". ce qui fonctionne parfaitement.
Merci beaucoup pour votre aide!
OriginalL'auteur Joel B Fant
Nous avons eu un problème similaire. Vous pouvez trouver la lecture cet article utile. Nous avons utilisé le ViewModel modèle décrit et il simplifie tout.
OriginalL'auteur Shaun Bowe