2010-11-11 6 views
0

У меня есть xml (при необходимости может быть изменена структура), которая должна быть привязана к элементу управления treeview в wpf, так что когда я нажимаю на конкретный узел в дереве, он заполняет список с дополнительной информацией, которая также поступает из xml.wpf treeview bind to xml

Мой XML выглядит следующим образом:

<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> 

Так TreeView должно выглядеть следующим образом:

+Rootnode 
    -Mer101 
    -Ora101 
    -Ora102 

Когда пользователь нажимает на Mer101 например, ListBox связанных шоу ErrorMessage из xml.

Я попытался использовать иерархический шаблон и попробовать xmldataprovider с xdocument, но пока не повезло. У кого-нибудь есть идеи?

Благодаря Нихилу

ответ

0

Я нашел способ сделать это, не связывая HDT с xml. Вот 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> 

и код позади в xmldataprovider выглядит следующим образом:

XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.LoadXml(advEventsXML); 
     XmlDataProvider dataProvider = this.FindResource("xmlDataProvider") as XmlDataProvider; 
     dataProvider.Document = xmlDoc; 

     treeview.DataContext = dataProvider; 

пример образца XML я использую выглядит следующим образом:

<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> 
1

Что касается TreeView, это работает (хлопнуть его в 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 [email protected]}" /> 
       </HierarchicalDataTemplate> 
       <HierarchicalDataTemplate 
        DataType="Events" 
        ItemsSource="{Binding XPath=*}"> 
        <TextBlock 
         Text="Expand to view Events" /> 
       </HierarchicalDataTemplate> 
      </TreeView.Resources> 
     </TreeView> 
    </Grid> 
</Page> 

К сожалению, вы не можете связываться с SelectedItem из в TreeView. Чтобы узнать, какой элемент выбран, check out this question on the subject.

+0

Будет, это сработало отлично. Я также получил дерево, работающее по-другому, и опубликую ответ ниже. Единственное различие заключается в том, что я использую datatriggers, и поэтому HDT не связан непосредственно с xml, если он изменяется. Спасибо за ссылку на выбранный элемент в телевизорах. Я дам вам кредит на ответ. – Nikhil