0

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

Nikhil
  • 181
  • 3
  • 12

2 Answers2

1

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.

Community
  • 1
  • 1
  • Will, that worked great. I also got the tree working in a different way and will be posting an answer below. The only difference is I'm using datatriggers and hence the HDT isn't bound directly to the xml if it changes. Thanks for the link to the selected item in TVs. I shall give you credit for the answer. – Nikhil Nov 11 '10 at 18:40
0

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>
Nikhil
  • 181
  • 3
  • 12