首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WPF 學習筆記 (12):資料繫結進階 — 資料提供者 (XmlDataProvider / ObjectDataProvider)

     編輯:關於.NET

XmlDataProvider:直接繫結 XML 資料

內嵌 XML 資料島

<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、* 等)。

外部 XML 檔案

<XmlDataProvider x:Key="personals" Source="pack://siteOfOrigin:,,,/Personals.xml" XPath="Personals" />

Source 指定 URI (支援 pack://)。

程式碼控制 XmlDocument

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:繫結 CLR 物件/方法

優於直接繫結物件三大優勢:

  1. XAML 中指定建構函式參數。
  2. 繫結至物件方法而非屬性。
  3. 支援非同步資料繫結。

建構函式參數

<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}" 直接繫結方法回傳集合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved