I have a XML databound to a TreeView with a XmlDataProvider. If i add a subnode to the XML the TreeView shows it, but how can i select this item?
XAML:
<Window.Resources>
<HierarchicalDataTemplate DataType="category" ItemsSource="{Binding XPath=child::node()}">
<TextBlock Text="{Binding XPath=@name}" 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>
I have a first approach:
this selects the newNode if i add him to the category on position 1, otherwise i become an exception ;-)
now i work on a dynamic once with more than one level :-)
It is late, so my functions arent the smoothest, but it works! I have comment it for all that once have the same problem ;-)
Usings:
Function:
This blog post describes how to select an item. Basically, you can't just use the TreeView.ItemContainerGenerator, as that just gives you access to the root TreeViewItems. The nested TreeViewItems are accessed using the TreeViewItem.ItemContainerGenerator of the parent TreeViewItem.