此次咱們來學習新的綁定知識,XML數據綁定。XmlDataProvider 用來綁定 XML 數據,該XML數據能夠是嵌入.Xmal文件的 XmlDataProvider 標記中,也能夠是外部位置引用的文件中。c#
固然嵌入式 XML 內容必須置於 XmlDataProvider 內部的 <x:XData> 標記中,並且不容易修改,因此建議使用XML數據文件形式。對於 XmlDataProvider 必須命名一個 x:Key 值,以便數據綁定目標可對其進行引用。app
XmlDataProvider 也能夠指向 XML 內容的外部源。例如,項目中一個 colors.xml 文件,文件的內容就是一個顏色列表。須要在 <StackPanel.Resources>異步
中添加一個 XmlDataProvider 資源,並將其的Source設置爲 XML 文件名便可。 代碼與XML文件以下。ide
<StackPanel> <StackPanel.Resources> <XmlDataProvider x:Key="MyColors" Source="Colors.xml" XPath="colors"> </XmlDataProvider> </StackPanel.Resources>
XML文件:函數
<?xml version="1.0" encoding="utf-8" ?> <colors > <color name="Pink"/> <color name="Red"/> <color name="Purple"/> <color name="Cyan"/> <color name="Gray"/> <color name="Turquoise"/> </colors>
資源綁定語法與控件綁定語法略有不一樣。綁定到控件時,能夠設置綁定的 ElementName 和 Path 屬性。可是綁定到資源時,須要設置 Source 屬性,因爲咱們是綁定到 XmlDataProvider,因此還要設置綁定的 XPath 屬性。例如,下列代碼可將 ListBox 的項綁定 MyColors資源。將 Source 屬性設置爲資源,並將其指定爲名爲 MyColors 的 StaticResource。XPath 屬性指示項會綁定到 XML 數據源中 <color> 元素的name屬性:佈局
<TextBlock Width="248" Height="24" Text="XML數據綁定:" TextWrapping="Wrap"/> <ListBox x:Name="listXmlColor" Width="248" Height="56" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Source={StaticResource MyColors},XPath=color/@name}"> </ListBox> <TextBlock Width="248" Height="24" Text="選中的顏色:" /> <TextBlock Width="248" Height="24" Text="{Binding ElementName=listXmlColor, Path=SelectedValue, Mode=OneWay}" > </TextBlock>
結果以下圖:學習
雖然 XmlDataProvider 對 XML 很是有用,可是當您想綁定到對象或對象列表時,能夠建立 ObjectDataProvider 做爲資源。ObjectDataProvider 的 ObjectType 指定將提供數據綁定源的對象,而 MethodName 則指示爲得到數據而需調用的方法。例如,假設我有一個名爲 StudentService 的類,該類使用一種名爲 GetStudentList的方法來返回列表 <Student>。那麼 ObjectDataProvider 應該以下所示:字體
<StackPanel.Resources> <ObjectDataProvider x:Key="students" ObjectType="{x:Type local:StudentService}" MethodName="GetStudentList"> </ObjectDataProvider> </StackPanel.Resources>
ObjectDataProvider 還可使用許多其餘屬性。ConstructionParameters 屬性容許您將參數傳遞給要調用的類的構造函數。此外,可使用 MethodParameters 屬性來指定參數,同時還可使用 ObjectInstance 屬性來指定現有的對象實例做爲源。spa
若是但願異步檢索數據,能夠將 ObjectDataProvider 的 IsAsynchronous 屬性設爲 true。這樣,用戶將能夠在等待數據填充綁定到 ObjectDataProvider 的源的目標控件時與屏幕進行交互。設計
在添加 ObjectDataProvider 時,必須限定數據源類的命名空間。在本例中,我必須將 xmlns 屬性添加到 <Window> 標記中,以便 local 快捷方式符合要求,並指示正確的命名空間:
xmlns:local="clr-namespace:WpfApp1.Services"
既然數據源已經過 ObjectDataProvider 定義,接下來就是如何將數據顯示在 ListBox 控件。我要把姓名、年齡、出生日期、國籍在每一個 ListBoxItem 中一行顯示。姓名用粗體,年齡、出生日期、國籍使用默認字體顯示。這在 XAML 中,經過使用數據模板(DataTemplate)很容易實現的,DataTemplate 容許您定義本身的顯示樣式。
以下代碼,在XAML代碼中我將 DataTemplate 定義成如何顯示Student信息的佈局樣式。我經過設置 DataTemplate 的 DataType 屬性爲students,告訴 DataTemplate 將要引用 Student類型。
我將對象數據students綁定到 ListBox 的 ItemsSource 屬性,這樣就把將數據綁定到 ListBox了,可是我沒有指定如何顯示綁定的數據,顯示樣式是經過將 ItemTemplate 屬性設置爲 studentLayout資源(即 DataTemplate 的鍵名),就能夠根據我以前在模板中設計的顯示樣式顯示數據了。最終結果如下圖 所示。
XMAL代碼:
<StackPanel Grid.Row="3"> <StackPanel.Resources> <ObjectDataProvider x:Key="students" ObjectType="{x:Type local:StudentService}" MethodName="GetStudentList"> </ObjectDataProvider> <DataTemplate x:Key="studentLayout" DataType="students"> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Path=Name}" FontWeight="Bold" Foreground="Blue"/> <TextBlock Text=", "></TextBlock> <TextBlock Text="{Binding Path=Age}"></TextBlock> <TextBlock Text=", "></TextBlock> <TextBlock Text="{Binding Path=Birthday}"></TextBlock> <TextBlock Text=", "></TextBlock> <TextBlock Text="{Binding Path=Country}"></TextBlock> </StackPanel> </DataTemplate> </StackPanel.Resources> <TextBlock Width="248" Height="24" Text="對象數據綁定:" TextWrapping="Wrap"/> <ListBox x:Name="listObjectBind" Width="450" Height="100" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Source={StaticResource students}}" ItemTemplate="{DynamicResource studentLayout}"> </ListBox> </StackPanel>
c#代碼以下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WpfApp1.Models; namespace WpfApp1.Services { public class StudentService { public List<Student> GetStudentList() { Student liang = new Student(); liang.Age = "18"; liang.Name = "梁丘"; liang.Birthday = "1990-02-03"; liang.Country = "中國"; Student zuo = new Student(); zuo.Age = "22"; zuo.Name = "左丘"; zuo.Birthday = "1992-02-03"; zuo.Country = "中國"; Student diwu = new Student(); diwu.Age = "32"; diwu.Name = "第五言"; diwu.Birthday = "1982-11-03"; diwu.Country = "中國"; Student yang = new Student(); yang.Age = "12"; yang.Name = "羊舌微"; yang.Birthday = "2002-11-13"; yang.Country = "中國"; List<Student> personList = new List<Student>(); personList.Add(liang); personList.Add(zuo); personList.Add(diwu); personList.Add(yang); return personList; } } }