< JIS90/JIS2004 | PageFunction.Resources >

September 11, 2008

XmlDataProvider にバインドしたコンボボックスの選択項目にバインドする

XmlDataProvider をバインドした ComboBox や ListView などの SelectedItem プロパティをデバッガで見ると、データ型が System.Xml.XmlAttribute だったり System.Xml.XmlElement だったりします。じゃあ、というわけで、さらに別のコントロールからバインドしてみました。

databind1.gif

コンボボックスの選択を変更すると、その下位の項目がリストボックスに出てきます。

databind2.gif

「すべてのカテゴリ」を選択すると、「すべての~類」の項目は表示されないのがひそかにミソだったりします 笑。

<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

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?