2010-11-11 186 views
0

我有一个xml(如果需要可以更改结构)需要绑定到wpf中的treeview控件,这样当我点击树中的特定节点时,它会填充一个列表框中的更多信息也来自xml。wpf treeview绑定到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> 

所以树形视图应该如下所示:

+Rootnode 
    -Mer101 
    -Ora101 
    -Ora102 

当例如在Mer101用户点击,列表框束缚节目来自xml的ErrorMessage。

我试过使用一个hierarchicaldatatemplate,并试图用xdocument xmldataprovider,但到目前为止没有运气。有没有人有任何想法?

感谢 尼基尔

回答

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

至于树视图,该作品(就打它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> 

不幸的是,你不能绑定到一个TreeView的的SelectedItem。为了知道哪个项目被选中,check out this question on the subject.

+0

请问,这很好。我还以不同的方式工作,并将在下面发布答案。唯一的区别是我使用的是数据触发器,因此如果它发生变化,HDT不会直接绑定到xml。感谢您选择电视中所选项目的链接。我会给你信用的答案。 – Nikhil 2010-11-11 18:40:28