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