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>
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>
はい、ルートが表示されるようになりました。
編集は次回に続きます。
0 件のコメント:
コメントを投稿