[C#.NET][WPF] 控制項的資料繫結(五)–ObjectDataProvider(續)
上篇提到ObjectDataProvider在XAML裡的用法,但仍不夠詳細,本篇期待將它補完,XAML可以將.NET的類別加入參考,然後初始化、呼叫方法傳遞、參數
先定義MemberList類別
public class MemberList : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
public MemberList()
{
}
public string Name { get; set; }
public MemberList(string Name)
{
this.Name = Name;
}
public string GetName()
{
return this.Name;
}
public string GetName(string Name)
{
return this.Name + Name;
}
private ObservableCollection<Member> _members = new ObservableCollection<Member>
{
new Member { ID = 1 , Name = "余小章" , Age = 18,Phone="0806449"},
new Member { ID = 2 , Name = "gy" , Age = 65,Phone="2" },
new Member { ID = 3, Name = "Raymond", Age = 13, Phone = "3" },
new Member { ID = 4, Name = "Kobe", Age = 32, Phone = "43" },
};
public List<Member> GetGroup()
{
if (this._members == null)
return null;
return this._members.Where(o => o.ID >= 1).ToList();
}
private BindingList<Member> _Group = null;
public BindingList<Member> Group
{
get
{
if (this._Group == null)
{
this._Group = new BindingList<Member>();
this._Group.Add(new Member { ID = 1, Name = "余小章", Age = 12, Phone = "0806449" });
this._Group.Add(new Member { ID = 2, Name = "gy", Age = 15, Phone = "2" });
this._Group.Add(new Member { ID = 3, Name = "Raymond", Age = 13, Phone = "3" });
this._Group.Add(new Member { ID = 4, Name = "Kobe", Age = 32, Phone = "43" });
}
return _Group;
}
set
{
_Group = value;
OnPropertyChanged("Group");
}
}
}
匯入專案裡的命名空間,local是縮寫定義
xmlns:local="clr-namespace:Demo01"
匯入.NET的命名空間,System、System.IO是縮寫定義
xmlns:System.IO="clr-namespace:System.IO;assembly=mscorlib"
xmlns:System="clr-namespace:System;assembly=mscorlib"
用法一:初始化類別,呼叫不帶參數的建構函數,請參考上篇
<Window.DataContext>
<ObjectDataProvider x:Name="dataSource" ObjectType="{x:Type local:MemberList}"/>
</Window.DataContext>
用法二:初始化類別,呼叫帶參數的建構函數,這裡定義了ObjectDataProvider.ConstructorParameters區段
<Window.DataContext>
<ObjectDataProvider x:Name="dataSource" d:IsDataSource="True" ObjectType="{x:Type local:MemberList}">
<ObjectDataProvider.ConstructorParameters>
<System:String>余小章</System:String>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
</Window.DataContext>
用法三:綁定方法,不帶參數,定義MethodName區段,表示由XAML呼叫方法
<Window.DataContext>
<ObjectDataProvider x:Name="dataSource" d:IsDataSource="True" ObjectType="{x:Type local:MemberList}" MethodName="GetName" >
<ObjectDataProvider.ConstructorParameters>
<System:String>余小章</System:String>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
</Window.DataContext>
用法四:綁定方法,帶參數
<Window.Resources>
<ObjectDataProvider x:Key="dataSource" ObjectType="{x:Type local:MemberList}" MethodName="GetName" >
<ObjectDataProvider.ConstructorParameters>
<System:String>霹靂無敵</System:String>
</ObjectDataProvider.ConstructorParameters>
<ObjectDataProvider.MethodParameters>
<System:String>余小章</System:String>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
當我設定繫結時,TextBox馬上就會出現結果,如沒有馬上出現結果表示你的元件可能還沒有經過編譯
接下來,我要用綁定類別方法的方式,呼叫 .NET Directory類別裡的GetDirectories方法
<Window.DataContext>
<ObjectDataProvider x:Name="dataSource" ObjectType="{x:Type System.IO:Directory}" MethodName="GetDirectories" >
<ObjectDataProvider.MethodParameters>
<System:String>D:\</System:String>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.DataContext>
綁定自定義的類別方法:
首先,我先建立一個Border容器裝dataGrid,然後呼叫MemberList.GetGroup方法,XAML定義如下
<Border.DataContext>
<ObjectDataProvider x:Name="memberList" ObjectType="{x:Type local:MemberList}" MethodName="GetGroup"/>
</Border.DataContext>
繫結節果如下:
範例下載:
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET