[C#.NET][WPF] 控制項的資料繫結(四)–ObjectDataProvider
前面幾篇是用來綁定單一筆資料,ObjectDataProvider是用來繫結集合、陣列,綁定方式跟前面幾篇差不多
1.在cs檔裡,建立MemberList類別,Group屬性用來建立BindingList<Member>
public class MemberList : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
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");
}
}
}
在xaml檔裡
1.宣告命名空間:xmlns:local="clr-namespace:Demo01"
2.定義ObjectDataProvider:
<Window.DataContext>
<ObjectDataProvider x:Name="dataSource" ObjectType="{x:Type local:MemberList}"/>
</Window.DataContext>
或
<Window.Resources>
<ObjectDataProvider x:Key="dataSource" ObjectType="{x:Type local:MemberList}"/>
</Window.Resources>
我個人是比較喜歡DataContext
規劃以下UI,Textbox(ID,Age,Name,Phone)想要跟著DataGrid一起變動,也就是滑鼠指到DataGrid哪一列Textbox就跟著變資料
集合控制項裡大都有ItemsSource及Items屬性,兩種方法只能選一種來用,ItemsSource是資料繫結用,Items有Add方法,可直接加入資料至控制項;假設如果你用了ItemsSource屬性,就不能再使用Items.Add方法,這時應該對資料來源做處理。
先來處理一下DataGrid的ItemSource屬性
繫結成功就會下圖那樣
AutoGenerateColumns設為True後,DataGrid就跑出資料來了
接下來我要讓Textbox們跟著DataGrid變動,原理就是將Text屬性的資料來源指向dataGrid1.ItemsSource屬性
設定好之後,就按F5來測測看吧,Textbox們奇怪怎麼不會跟著DataGrid變動
找一下有沒有可疑的屬性可以用,這時發現了IsSynchronizedWithCurrentItem屬性,將它設為true
這時TextBox們就會跟著dataGrid變動了
接下來談談如何處理資料來源,這次我們要處理的是ObjectDataProvider類別,將它從DataContext或是Resource取出,並轉型成MemberList
MemberList _MemberList = null;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//object obj = this.Resources["dataSource"];
//if (obj is ObjectDataProvider)
//{
// this._MemberList = ((ObjectDataProvider)obj).ObjectInstance as MemberList;
//}
object obj = this.DataContext;
if (obj is ObjectDataProvider)
{
this._MemberList = ((ObjectDataProvider)obj).ObjectInstance as MemberList;
}
}
這時只要對_MemberList 變數處理即可,比如說我想新增一筆資料
private void btnAdd_Click(object sender, RoutedEventArgs e)
{
Member member = new Member() { ID = int.Parse(textBox5.Text), Age = int.Parse(textBox6.Text), Name = textBox7.Text, Phone = textBox8.Text };
if (this._MemberList == null)
return;
this._MemberList.Group.Add(member);
}
按下Add鈕後就會新增一筆資料,並在dataGrid裡呈現出來。
ListBox與ComboBox的繫結方式相同,分別處理ItemsSource、DisplayMemberPath屬性
輸入想要呈現資料的欄位名稱
呈現的結果如下
範例下載:
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET