WPF 中以 XML 為資料來源的 Data Binding (1)

WinForm 的 Data Binding (資料繫結) 已是老生常談的話題,但對 WPF 來說,卻有不少新的體驗。
本系列將示範 WPF 程式設計中,如何以 XML 為資料來源,實作 data binding:
第一部分將介紹 XmlDataProvider 的使用方法,將指定的資料 binding 到 ListBox


解說
資料來源為 FileExtensions.xml:

<?xml version="1.0" encoding="utf-8" ?>
<fileExtension>
  <category>
    <name>PHP</name>
    <extension>.php</extension>
    <extension>.phtml</extension>
    <extension>.php3</extension>
    <extension>.php4</extension>
  </category>
  <category>
    <name>ASP</name>
    <extension>.asp</extension>
    <extension>.aspx</extension>
  </category>
  <category>
    <name>JSP</name>
    <extension>.jsp</extension>
    <extension>.do</extension>
  </category>
  <category>
    <name>ColdFusion</name>
    <extension>.cfc</extension>
    <extension>.cfm</extension>
  </category>
</fileExtension>

UI 佈局使用 XAML:

<Window x:Class="WPF_XML_Data_Binding_Demo.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WPF XML Data Binding Demo" Height="300" Width="360">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="60"/>
        </Grid.RowDefinitions>
        <Grid.DataContext>
            <XmlDataProvider Source="FileExtensions.xml" />
        </Grid.DataContext>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <ListBox Margin="4" Name="listBoxCategory" ItemsSource="{Binding XPath=fileExtension/category/name}" SelectionChanged="listBoxCategory_SelectionChanged"/>
            <ListBox Margin="4" Grid.Column="1"  Name="listBoxExtension" ItemsSource="{Binding XPath=fileExtension/category/extension}" SelectionChanged="listBoxExtension_SelectionChanged"  SelectionMode="Multiple"/>
        </Grid>
        <StackPanel Grid.Row="1" Margin="4" Name="stackPanel1" Orientation="Horizontal" VerticalAlignment="Top">
            <Label Height="28" Margin="0">Your choice:</Label>
            <TextBox Height="23" Name="textBox1" Width="150"/>
            <Button Grid.Row="2" Width="60" Margin="40,0,0,0" HorizontalAlignment="Right" Click="Button_Click">Reset</Button>
        </StackPanel>
    </Grid>
</Window>

不難發現在 XAML 的第 8 行,也就是 ListBox 的上一層容器 – Grid 裡,我們使用了 XmlDataProvider
之後在第 15、16 行各自設定了 ListBox 的資料來源,且搭配 XPath 即可輕鬆存取 XML 的子元素;
除此之外,還設定了選擇變更的事件命令,並將 listBoxExtension 的選擇模式設為多選。

結果
執行結果如圖:

小結
本文以 ListBox 為例,示範了於控制項的外層容器加入 XMLDataProvider 作為 DataContext
後文將介紹如何存取控制項的 data Binding 內容。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *