2014年4月24日木曜日

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

XMLデータをそのまま TreeView に表示してみたいと思います。

ソリューションにXMLファイル追加
XMLデータを作るのが面倒だったので、「気象庁防災情報XMLフォーマット 技術資料」のサンプルデータをお借りします。

ソリューションに追加し、下記設定を行います。
ビルド アクション   :コンテンツ
出力ディレクトリにコピー:新しい場合はコピーする

XMLをソリューションに追加


XMLをロードして TreeView に表示する
C#で書くのが普通ですが、DataProvider を使えば XAML だけで出来ます(Silverlightは不可)。今回はXmlDataProviderを使ったやり方でロードしましょう。

    <Window.Resources>
        <XmlDataProvider x:Key="xmlDataProvider" Source="Data\70_04_01_091210_fure-1.xml" ></XmlDataProvider>
    </Window.Resources>
    <Grid>
        <TreeView Margin="5"
                  ItemsSource="{Binding Source={StaticResource xmlDataProvider}, XPath=*}"
                  />

これだけだと、XML の Value だけが抽出されて表示されてしまいます。

TreeView に XML データを表示


ItemTemplate を定義してあげます。

    <Window.Resources>
        <XmlDataProvider x:Key="xmlDataProvider" Source="Data\70_04_01_091210_fure-1.xml" ></XmlDataProvider>
        <HierarchicalDataTemplate x:Key="NodeTemplate">
            <StackPanel Orientation="Horizontal">
                <Grid>
                    <TextBlock x:Name="nameTextBlock" Visibility="Visible" Text="{Binding Path=Text, ElementName=nameTextBox}" />
                </Grid>
            </StackPanel>
            <HierarchicalDataTemplate.ItemsSource>
                <Binding XPath="child::node()" />
            </HierarchicalDataTemplate.ItemsSource>
            <HierarchicalDataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path=NodeType}" Value="Text">
                    <Setter TargetName="nameTextBlock" Property="Text" Value="{Binding Path=Value, Mode=OneTime}" />
                    <Setter TargetName="nameTextBlock" Property="FontWeight" Value="Bold" />
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=NodeType}" Value="Element">
                    <Setter TargetName="nameTextBlock" Property="Text" Value="{Binding Path=Name, Mode=OneTime}" />
                </DataTrigger>
            </HierarchicalDataTemplate.Triggers>
        </HierarchicalDataTemplate>
    </Window.Resources>
    <Grid>
        <TreeView Margin="5"
                  ItemsSource="{Binding Source={StaticResource xmlDataProvider}, XPath=*}"
                  ItemTemplate="{StaticResource NodeTemplate}"
                  />
    </Grid>



TreeView に XML データを表示

いい感じでツリー表示されるようになりました。デフォルトはツリー閉じている状態なので、最初から全て開いておきたければ、リソースに下記を追加するだけでOKです。

        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="True"/>
        </Style>

TreeView に XML データを表示

Attributes(属性値)をここに表現するのは難しいので、ここでは割愛します。要素がコメントの場合は色を変えたいとかであれば、下記トリガーの設定でいけます。

                <DataTrigger Binding="{Binding Path=NodeType}" Value="Comment">
                    <Setter TargetName="nameTextBox" Property="Text" Value="{Binding Path=Value, Mode=OneTime}" />
                    <Setter TargetName="nameTextBlock" Property="Foreground" Value="#FF00FF00" />

                </DataTrigger>


閲覧だけなら XmlDataProvider で十分なのですが、編集には向いていないようです。
編集するなら XDocument で扱う方がよさそうです。XDocument として読み込むには ObjectDataProvider が使えますが、それはまた次回。


関連






1 件のコメント:

  1. Hi, I am from Taiwan. This post helped me a lot, just wanna say thank you very much to you.

    返信削除