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 內容。