[C#.NET][WPF] 控制項的資料繫結(四) - ObjectDataProvider

[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

image

 

規劃以下UI,Textbox(ID,Age,Name,Phone)想要跟著DataGrid一起變動,也就是滑鼠指到DataGrid哪一列Textbox就跟著變資料

image

 

 


集合控制項裡大都有ItemsSource及Items屬性,兩種方法只能選一種來用,ItemsSource是資料繫結用,Items有Add方法,可直接加入資料至控制項;假設如果你用了ItemsSource屬性,就不能再使用Items.Add方法,這時應該對資料來源做處理。

先來處理一下DataGrid的ItemSource屬性

image

 

繫結成功就會下圖那樣

image

 

AutoGenerateColumns設為True後,DataGrid就跑出資料來了

 

image

 

接下來我要讓Textbox們跟著DataGrid變動,原理就是將Text屬性的資料來源指向dataGrid1.ItemsSource屬性

image

image

 

 

設定好之後,就按F5來測測看吧,Textbox們奇怪怎麼不會跟著DataGrid變動

image

 

找一下有沒有可疑的屬性可以用,這時發現了IsSynchronizedWithCurrentItem屬性,將它設為true

image

 

 

 

 

這時TextBox們就會跟著dataGrid變動了

image


接下來談談如何處理資料來源,這次我們要處理的是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裡呈現出來。

image


 

ListBox與ComboBox的繫結方式相同,分別處理ItemsSource、DisplayMemberPath屬性

image

 

輸入想要呈現資料的欄位名稱

image

 

呈現的結果如下

image

 

 

 


範例下載:

 

WpfBindingDemo.zip

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo