J'ai une base de données XML vers un TreeView avec un XmlDataProvider. Si j'ajoute un sous-noeud au XML, TreeView le montre, mais comment puis-je sélectionner cet élément?Comment sélectionner une TreeViewItem de databound?
XAML:
<Window.Resources>
<HierarchicalDataTemplate DataType="category" ItemsSource="{Binding XPath=child::node()}">
<TextBlock Text="{Binding [email protected]}" FontWeight="Bold" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="card">
<TextBlock Text="{Binding XPath=./title}" FontStyle="Italic" />
</HierarchicalDataTemplate>
<XmlDataProvider x:Key="dataxml" XPath="root/cards"/>
</Window.Resources>
<TreeView Name="treeView"
ItemsSource="{Binding Source={StaticResource dataxml},
XPath=./*,
UpdateSourceTrigger=PropertyChanged}"
/>
CS:
public partial class MainWindow : Window
{
XmlDataProvider xmlDataProvider = new XmlDataProvider();
public MainWindow()
{
InitializeComponent();
xmlDataProvider = this.FindResource("dataxml") as XmlDataProvider;
xmlDataProvider.Source = new Uri(System.IO.Path.GetFullPath(fullPathToXml), UriKind.Absolute);
xmlDataProvider.Refresh();
}
public void AddChild()
{
XmlNode newNode = xmlDataProvider.Document.CreateElement("card");
XmlNode selectedItem = (XmlNode)treeView.SelectedItem;
if (selectedItem != null)
{
//add the newNode as child to the selected
selectedItem.AppendChild(newNode);
//select the childnode (newNode) ????? <=====
}
else
{
//add the newNode as child to the rootnode and select it:
xmlDataProvider.Document.DocumentElement["cards"].AppendChild(newNode);
(treeView.ItemContainerGenerator.ContainerFromItem(newNode) as TreeViewItem).IsSelected = true;
}
xmlDataProvider.Document.Save(fullPathToXml);
xmlDataProvider.Refresh();
}
}
XML:
<root>
<settings>
....
..
</settings>
<cards>
<category name="C1">
<card name="card1">
<question>bla</question>
<answer>blub</answer>
</card>
<category name="C2">
<card name="card4">
<question>bla</question>
<answer>blub</answer>
</card>
</category>
</category>
<card name="card2">
<question>bla</question>
<answer>blub</answer>
</card>
<card name="card3">
<question>bla</question>
<answer>blub</answer>
</card>
</cards>
</root>
je sais que je ne peux pas utiliser la ItemContainerGenerator et qu'il me donne seulement l'accès aux éléments racine. Je l'ai trouvé à la dure :-D Votre article de blog est interessant, je vais l'essayer demain ;-) – jwillmer
J'ai testé l'exemple et ça n'a pas fonctionné car comme vous l'aviez dit il me donne juste accès à la racine TreeViewItems. Donc je pense que j'ai besoin d'une récursivité ... mais comment? avec le premier appel de treeView.ItemContainerGenerator.ContainerFromIndex (..) je suis devenu TreeViewItem et pas un autre conteneur, je suis un peu coincé :-( – jwillmer
thx, mais maintenant je l'ai fait à la dure, juste un peu plus longtemps que votre Solution ;-) – jwillmer