<Window.Resources>
<XmlDataProvider x:Key="personals" XPath="Personals">
<x:XData>
<Personals xmlns="">
<Personal Name="Tom" Age="15" Sex="Male" />
<Personal Name="Mary" Age="11" Sex="Female" />
<Personal Name="Jack" Age="12" Sex="Male" />
</Personals>
</x:XData>
</XmlDataProvider>
</Window.Resources>
<StackPanel DataContext="{StaticResource personals}">
<ListBox ItemsSource="{Binding XPath=*}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding XPath=@Name}"/><TextBlock>,</TextBlock>
<TextBlock Text="{Binding XPath=@Age}"/><TextBlock>,</TextBlock>
<TextBlock Text="{Binding XPath=@Sex}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
xmlns="" 不可省略;繫結使用 XPath 語法 (@Attribute、* 等)。
<XmlDataProvider x:Key="personals" Source="pack://siteOfOrigin:,,,/Personals.xml" XPath="Personals" />
Source 指定 URI (支援 pack://)。
var provider = this.FindResource("personals") as XmlDataProvider;
var xml = new XmlDocument(); xml.Load("Personals.xml");
provider.Document = xml; provider.XPath = "Personals";
修改 XmlDocument 即自動同步 UI:
var mary = xml.SelectSingleNode("Personals/Personal[@Name='Mary']") as XmlElement;
mary.SetAttribute("Age", (int.Parse(mary.GetAttribute("Age")) + 1).ToString());
屬性 Source/Document/XmlNamespaceManager/XPath 變更會觸發重新整理;批次修改建議使用 DeferRefresh。
優於直接繫結物件三大優勢:
<ObjectDataProvider x:Key="personal" ObjectType="{x:Type my:Personal}">
<ObjectDataProvider.ConstructorParameters>
<sys:String>Tom</sys:String>
<sys:Int32>15</sys:Int32>
<my:Sex>Male</my:Sex>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
public class PersonalList : ObservableCollection<Personal> {
public IEnumerable<Personal> GetPersonals(int top) {
this.Add(new Personal("Tom",15,Sex.Male));
this.Add(new Personal("Mary",11,Sex.Female));
this.Add(new Personal("Jack",13,Sex.Male));
return this.Take(top);
}
}
// XAML
<ObjectDataProvider x:Key="personals" ObjectType="{x:Type my:PersonalList}" MethodName="GetPersonals">
<ObjectDataProvider.MethodParameters>
<sys:Int32>2</sys:Int32>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
ListBox.ItemsSource="{Binding}" 直接繫結方法回傳集合。