Reputation: 181
I have an xml (the structure can be changed if need be) which needs to be bound to a treeview control in wpf, such that when I click on a particular node in the tree, it populates a list box with more information which also comes from the xml.
My xml is as follows:
<Event locale="en-US">
<Eventid Name="Mer101">
<EventType>StoredProc</EventType>
<EventParameters>
<EventParameter>Field1</EventParameter>
<EventParameter>Field2</EventParameter>
</EventParameters>
<ErrorMessage>Error_Msg_Localized_ID {Field1} {Field2}...</ErrorMessage>
<EventStartDate>DateTime</EventStartDate>
<EventEndDate>DateTime</EventEndDate>
</Eventid>
<Eventid Name="Ora101">
<EventType>LowLevelEvents</EventType>
<EventParameters>
<EventParameter>Field1</EventParameter>
</EventParameters>
<ErrorMessage>Error message {Field1}...</ErrorMessage>
<EventStartDate>DateTime</EventStartDate>
<EventEndDate>DateTime</EventEndDate>
</Eventid>
<Eventid Name="Ora102">
<EventType>LowLevelEvents</EventType>
<EventParameters>
<EventParameter>Field1</EventParameter>
<EventParameter>Field2</EventParameter>
</EventParameters>
<ErrorMessage>Error message {Field1} {Field2}...</ErrorMessage>
<EventStartDate>DateTime</EventStartDate>
<EventEndDate>DateTime</EventEndDate>
</Eventid>
So the treeview should look like the following:
+Rootnode
-Mer101
-Ora101
-Ora102
When the user clicks on Mer101 for example, the listbox bound shows the ErrorMessage from the xml.
I've tried to use a hierarchicaldatatemplate and trying xmldataprovider with an xdocument but getting no luck so far. Does anyone have any ideas?
Thanks Nikhil
Upvotes: 0
Views: 1278
Reputation: 181
I found a way to do it without tying the HDT to the xml. Here is the xaml:
<Window x:Class="DBUpgradeUI.DBUpgEventReportingResolution"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DBUpgEventReportingResolution" Height="453" Width="549" WindowStartupLocation="CenterScreen" Loaded="Window_Loaded">
<Window.Resources>
<HierarchicalDataTemplate x:Key="TVTemplate">
<TextBlock x:Name="text" Text="?" />
<HierarchicalDataTemplate.ItemsSource>
<Binding XPath="child::node()" />
</HierarchicalDataTemplate.ItemsSource>
<HierarchicalDataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=NodeType}" Value="Text">
<Setter TargetName="text" Property="Text" Value="{Binding Path=Value}"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=NodeType}" Value="Element">
<Setter TargetName="text" Property="Text" Value="{Binding Path=Name}"></Setter>
</DataTrigger>
</HierarchicalDataTemplate.Triggers>
</HierarchicalDataTemplate>
<XmlDataProvider x:Key="xmlDataProvider" />
</Window.Resources>
<Grid>
<TreeView Name="treeview" ItemsSource="{Binding Source={StaticResource xmlDataProvider},XPath=*}"
Margin="0,37,0,0" HorizontalAlignment="Left" Width="198"
ItemTemplate="{StaticResource TVTemplate}"
/>
</Grid>
and the code behind to the xmldataprovider is as follows:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(advEventsXML);
XmlDataProvider dataProvider = this.FindResource("xmlDataProvider") as XmlDataProvider;
dataProvider.Document = xmlDoc;
treeview.DataContext = dataProvider;
an example of the sample xml I'm using is as follows:
<AllEvents>
<Meridium>Mer101
<Type>StoredProcedure</Type>
<EventParameters>Field1</EventParameters>
<ErrorMessage>Error_Msg_Localized_ID {Field1} {Field2}...</ErrorMessage>
<EventStartDate>DateTime</EventStartDate>
<EventEndDate>DateTime</EventEndDate>
</Meridium>
<OtherEvents>
<Database>Ora101
<Type>LowerLevelEvents</Type>
<EventParameters>
<Parameter>Field1</Parameter>
<Parameter>Field2</Parameter>
</EventParameters>
<ErrorMessage>Error_Msg_Localized_ID {Field1} {Field2}...</ErrorMessage>
<EventStartDate>DateTime</EventStartDate>
<EventEndDate>DateTime</EventEndDate>
</Database>
<Database>Ora102
<Type>LowerLevelEvents</Type>
<EventParameters>
<Parameter>Field1</Parameter>
<Parameter>Field2</Parameter>
</EventParameters>
<ErrorMessage>Error_Msg_Localized_ID {Field1} {Field2}...</ErrorMessage>
<EventStartDate>DateTime</EventStartDate>
<EventEndDate>DateTime</EventEndDate>
</Database>
</OtherEvents> </AllEvents>
Upvotes: 0
Reputation:
As for the treeview, this works (slap it in Kaxaml):
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<XmlDataProvider
x:Key="events"
XPath="/Events">
<x:XData>
<Events
xmlns="">
<Eventid
Name="Mer101">
<EventType>StoredProc</EventType>
<EventParameters>
<EventParameter>Field1</EventParameter>
<EventParameter>Field2</EventParameter>
</EventParameters>
<ErrorMessage>Error_Msg_Localized_ID {Field1} {Field2}...</ErrorMessage>
<EventStartDate>DateTime</EventStartDate>
<EventEndDate>DateTime</EventEndDate>
</Eventid>
<Eventid
Name="Ora101">
<EventType>LowLevelEvents</EventType>
<EventParameters>
<EventParameter>Field1</EventParameter>
</EventParameters>
<ErrorMessage>Error message {Field1}...</ErrorMessage>
<EventStartDate>DateTime</EventStartDate>
<EventEndDate>DateTime</EventEndDate>
</Eventid>
<Eventid
Name="Ora102">
<EventType>LowLevelEvents</EventType>
<EventParameters>
<EventParameter>Field1</EventParameter>
<EventParameter>Field2</EventParameter>
</EventParameters>
<ErrorMessage>Error message {Field1} {Field2}...</ErrorMessage>
<EventStartDate>DateTime</EventStartDate>
<EventEndDate>DateTime</EventEndDate>
</Eventid>
</Events>
</x:XData>
</XmlDataProvider>
</Page.Resources>
<Grid>
<TreeView
x:Name="tv"
ItemsSource="{Binding Source={StaticResource events}}">
<TreeView.Resources>
<HierarchicalDataTemplate
DataType="Eventid">
<TextBlock
Text="{Binding XPath=@Name}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate
DataType="Events"
ItemsSource="{Binding XPath=*}">
<TextBlock
Text="Expand to view Events" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
</Grid>
</Page>
Unfortunately, you can't bind to the SelectedItem of a TreeView. In order to know which item is selected, check out this question on the subject.
Upvotes: 1