XmlDataProvider にバインドしたコンボボックスの選択項目にバインドする
XmlDataProvider をバインドした ComboBox や ListView などの SelectedItem プロパティをデバッガで見ると、データ型が System.Xml.XmlAttribute だったり System.Xml.XmlElement だったりします。じゃあ、というわけで、さらに別のコントロールからバインドしてみました。
コンボボックスの選択を変更すると、その下位の項目がリストボックスに出てきます。
「すべてのカテゴリ」を選択すると、「すべての~類」の項目は表示されないのがひそかにミソだったりします 笑。
<Window x:Class="DataBindTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="データバインドのテスト">
<Window.Resources>
<XmlDataProvider XPath="/" x:Key="BeansData">
<x:XData>
<categories name="すべてのカテゴリ" xmlns="">
<category name="ささげ類">
<items name="すべてのささげ類">
<item name="あずき"/>
<item name="ささげ"/>
<item name="大納言"/>
</items>
</category>
<category name="いんげん類">
<items name="すべてのいんげん類">
<item name="大正金時豆"/>
<item name="うずら豆"/>
<item name="てぼ豆"/>
<item name="虎豆"/>
<item name="キドニービーン"/>
<item name="大福豆"/>
<item name="白花豆"/>
</items>
</category>
<category name="そらまめ類">
<items name="すべてのそらまめ類">
<item name="そらまめ"/>
</items>
</category>
<category name="えんどう類">
<items name="すべてのえんどう類">
<item name="えんどう"/>
</items>
</category>
<category name="だいず類">
<items name="すべてのだいず類">
<item name="大豆"/>
<item name="黒大豆"/>
<item name="青大豆"/>
</items>
</category>
</categories>
</x:XData>
</XmlDataProvider>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ComboBox x:Name="ComboCategory" ItemsSource="{Binding Source={StaticResource BeansData}, XPath=(/categories|//category)/@name}"/>
<ListBox Grid.Row="1" DataContext="{Binding ElementName=ComboCategory, Path=SelectedItem}" ItemsSource="{Binding XPath=(../items|..//item)/@name}"/>
</Grid>
</Window>
ところで、XPath で「categories エレメントまたは category エレメントの name アトリビュート」という指定を行う際に "(//categories|//category)/@name" は通るのに "//(categories|category)/@name" は通りません。これは、グループ化のほうがパス演算より優先して評価されるためらしいです。
参照: MSDN ライブラリ XPath リファレンス 演算子および特殊文字
トラックバック
- このエントリーにトラックバック:
- http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/2177
コメント