2014年4月24日木曜日

[WPF][C#]XMLデータをTreeViewに表示 その2

XmlDataProvider で XML データを TreeView に表示する方法を紹介しましたが、今回は ObjectDataProvider を使用して、XDocument として XML データを TreeView に表示する方法を紹介します。

XMLをロードして TreeView に表示する
子要素がない場合は値を横に表示する様にItemTemplateを変更しています。

[Namespace]
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:linq="clr-namespace:System.Xml.Linq;assembly=System.Xml.Linq"

[Resource]
        <ObjectDataProvider x:Key="xmlDocument" ObjectType="{x:Type linq:XDocument}" MethodName="Load">
            <ObjectDataProvider.MethodParameters >
                <sys:String>Data\70_04_01_091210_fure-1.xml</sys:String>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="True" />
        </Style>
        <HierarchicalDataTemplate x:Key="XmlTemplate" ItemsSource="{Binding Path=Elements}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Name="nameTextBlock" Text="{Binding Path=Name.LocalName}"/>
                <TextBlock Name="valueTextBlock" FontWeight="Bold" Margin="5,0" />
            </StackPanel>
            <HierarchicalDataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path=HasElements}" Value="False">
                    <Setter TargetName="valueTextBlock" Property="Text" Value="{Binding Path=Value}" />
                </DataTrigger>
            </HierarchicalDataTemplate.Triggers>
        </HierarchicalDataTemplate>

[Layout]
    <Grid>
        <TreeView Name="treeView" Margin="5"
                  ItemsSource="{Binding Path=Root.Elements, Source={StaticResource xmlDocument}}"
                  ItemTemplate= "{StaticResource XmlTemplate}"
                  >
        </TreeView>
    </Grid>

TreeView に XML データを表示

Root の表示
問題があって、これだと XML のルートが表示されません。仕方がないので、ここはコードで小細工をする必要があります。コンストラクタとかで、下記処理を書きます。

    var element = XElement.Load(@"Data\70_04_01_091210_fure-1.xml");
    var document = new XDocument(new XElement("Root", element));
    treeView.ItemsSource = document.Root.Elements();


やっていることは、XDocument でルートを自作して、子要素に読み込んだXElement を追加してあげているだけです。XAML側は要らないものを削るだけです。

    <Window.Resources>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="True" />
        </Style>
        <HierarchicalDataTemplate x:Key="XmlTemplate" ItemsSource="{Binding Path=Elements}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Name="nameTextBlock" Text="{Binding Path=Name.LocalName}"/>
                <TextBlock Name="valueTextBlock" FontWeight="Bold" Margin="5,0" />
            </StackPanel>
            <HierarchicalDataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path=HasElements}" Value="False">
                    <Setter TargetName="valueTextBlock" Property="Text" Value="{Binding Path=Value}" />
                </DataTrigger>
            </HierarchicalDataTemplate.Triggers>
        </HierarchicalDataTemplate>
    </Window.Resources>
    <Grid>
        <TreeView Name="treeView" Margin="5"
                  ItemTemplate= "{StaticResource XmlTemplate}"
                  >
        </TreeView>
    </Grid>

TreeView に XML データを表示

はい、ルートが表示されるようになりました。
編集は次回に続きます。






0 件のコメント:

コメントを投稿