wpf древовидная привязка к xml - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть xml (при необходимости можно изменить структуру), который необходимо привязать к элементу управления treeview в wpf, чтобы при щелчке по определенному узлу в дереве он заполнял список с дополнительной информацией который также происходит от 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, граница списка показывает ErrorMessage из xml.

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

Спасибо Нихилу

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

Что касается дерева, это работает (шлепните его в 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>

К сожалению, вы не можете привязаться к SelectedItem TreeView. Чтобы узнать, какой предмет выбран, проверьте этот вопрос по теме.

0 голосов
/ 11 ноября 2010

Я нашел способ сделать это, не привязывая 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...