資料不僅來源於物件,XML 和關聯式資料庫同樣常見。由於這些來源不直接儲存 .NET 物件,資料繫結需要間接層來轉換與載入資料。WPF 提供 IDataSource 介面實作作為這層中介,主要有三類:ObjectDataSource、XmlDataSource、自訂資料來源。
public class RemotePeopleLoader : People {
public RemotePeopleLoader() { /* 從遠端載入資料 */ }
}
// XAML
<ObjectDataSource x:Key="Family"
TypeName="PersonBinding.RemotePeopleLoader"
Asynchronous="True" />
TypeName 指定集合類別完整名稱。Asynchronous="True" 將建立物件的工作交給背景執行緒,避免長時間載入阻塞 UI 執行緒。
<ObjectDataSource ... Parameters="https://url1, https://url2" />
// 對應建構函式
public RemotePeopleLoader(string url1, string url2) { ... }
Parameters 以逗號分隔字串傳遞給建構函式。注意:僅支援字串參數,其他型別需自行在建構函式中轉換。
IDataSource ds = (IDataSource)this.FindResource("Family");
People people = (People)ds.Data; // 透過 Data 屬性取得集合
雖然資料來源透露 Data 屬性,但 XAML 繫結時仍直接 ItemsSource="{Binding}",WPF 內建支援 IDataSource 會自動解析。
<XmlDataSource x:Key="Family" Source="family.xml" XPath="/Family/Person" />
// 繫結使用 XPath 而非 Path
<TextBlock TextContent="{Binding XPath=@Name}" />
直接在 XAML 中內嵌 XML 內容,移除 Source 屬性保留 XPath。
XmlElement,使用 GetAttribute/SetAttribute 操作屬性XmlDataSource.Document.CreateElement 建立並加入 XML 樹狀結構IComparer 比較 XmlElement 屬性值WPF 目前無直接支援關聯式資料庫繫結,建議參考 WinFX SDK 範例。若內建資料來源無法滿足需求,可自訂實作 IDataSource(範例 4-46),在建構函式載入資料後觸發 DataChanged 事件通知繫結系統,支援非同步載入與 Refresh 方法重新整理。