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

[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馬上就會出現結果,如沒有馬上出現結果表示你的元件可能還沒有經過編譯

image


接下來,我要用綁定類別方法的方式,呼叫 .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>

 

 

image

 


 

綁定自定義的類別方法:

首先,我先建立一個Border容器裝dataGrid,然後呼叫MemberList.GetGroup方法,XAML定義如下

<Border.DataContext>
    <ObjectDataProvider x:Name="memberList" ObjectType="{x:Type local:MemberList}" MethodName="GetGroup"/>
</Border.DataContext>

繫結節果如下:

image


範例下載:

WpfBindingDemo.zip

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


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

Image result for microsoft+mvp+logo