WPF数据绑定-简单对象的绑定

绑定自定义的数据类对象


在xaml代码中,Binding标记扩展中仅定义了Path属性,将它绑定到StudentData类的属性上。不需要定义源对象,因为通过指定DataContext类定义源对象。

DataContext是一个依赖属性,它用基于FramewrokElement定义。指定相应控件的DataContext属性表示当前控件中的每个元素都默认绑定此数据。


xaml代码

[csharp] view plain copy
print ?
  1. "BindingDemo.Window2"  
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  4.         Title="Window2" Height="300" Width="300">  
  5.       
  6.           
  7.         "stackPanel" HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Vertical">  
  8.             "lbId" Content="{Binding ID}"/>  
  9.             "lbName" Content="{Binding Name}"/>  
  10.             "lbAge" Content="{Binding Age}"/>  
  11.           
  12.       
  13.   

    
        
        
            
    

数据类

[csharp] view plain copy
print ?
  1. namespace BindingDemo  
  2. {  
  3.     public class StudentData  
  4.     {  
  5.         public int ID { getset; }  
  6.         public string Name { getset; }  
  7.         public int Age { getset; }  
  8.     }  
  9. }  
namespace BindingDemo
{
    public class StudentData
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

隐藏代码

[csharp] view plain copy
print ?
  1. public partial class Window2 : Window  
  2. {  
  3.     public Window2()  
  4.     {  
  5.         InitializeComponent();  
  6.   
  7.         Init();  
  8.     }  
  9.   
  10.     public void Init()  
  11.     {  
  12.         StudentData stuData = new StudentData();  
  13.         stuData.ID = 1001;  
  14.         stuData.Name = "小明";  
  15.         stuData.Age = 18;  
  16.   
  17.         //this.DataContext = stuData;//整个窗口内的所有元素都可以绑定此数据  
  18.         stackPanel.DataContext = stuData;//仅stackPanel内的所有元素可以绑定此数据  
  19.     }  
  20. }  
    public partial class Window2 : Window
    {
        public Window2()
        {
            InitializeComponent();

            Init();
        }

        public void Init()
        {
            StudentData stuData = new StudentData();
            stuData.ID = 1001;
            stuData.Name = "小明";
            stuData.Age = 18;

            //this.DataContext = stuData;//整个窗口内的所有元素都可以绑定此数据
            stackPanel.DataContext = stuData;//仅stackPanel内的所有元素可以绑定此数据
        }
    }


以上绑定当修改数据内容时界面显示是不会更改的,要实现更改信息传递给用户界面,数据类必须实现INotifyPropertyChanged接口。

该接口定义了ProperytChanged事件,该事件在OnPropertyChagned方法中触发。

xaml代码

[csharp] view plain copy
print ?
  1. "BindingDemo.Window2"  
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  4.         Title="Window2" Height="300" Width="300">  
  5.       
  6.           
  7.         "stackPanel" HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Vertical">  
  8.             "lbId" Content="{Binding ID}"/>  
  9.             "lbName" Content="{Binding Name}"/>  
  10.             "lbAge" Content="{Binding Age}"/>  
  11.               
  12.             "btnChang" Content="按钮" Click="btnChang_Click"/>  
  13.           
  14.       
  15.   

    
        
        
            

数据类

[csharp] view plain copy
print ?
  1. namespace BindingDemo  
  2. {  
  3.     public class StudentData : INotifyPropertyChanged  
  4.     {  
  5.         private int _id = 0;  
  6.         private string _name = "";  
  7.         private int _age = 0;  
  8.   
  9.         public int ID   
  10.         {   
  11.             get { return _id; }   
  12.             set   
  13.             {   
  14.                 _id = value;  
  15.   
  16.                 OnPropertyChanged("ID");  
  17.             }   
  18.         }  
  19.         public string Name  
  20.         {  
  21.             get { return _name; }  
  22.             set   
  23.             {   
  24.                 _name = value;  
  25.                 OnPropertyChanged("Name");  
  26.             }  
  27.         }  
  28.         public int Age   
  29.         {  
  30.             get { return _age; }  
  31.             set   
  32.             {   
  33.                 _age = value;  
  34.                 OnPropertyChanged("Age");  
  35.             }  
  36.         }  
  37.   
  38.         public event PropertyChangedEventHandler PropertyChanged;  
  39.         protected void OnPropertyChanged(string propertyName)  
  40.         {  
  41.             if(PropertyChanged != null)  
  42.             {  
  43.                 PropertyChanged(thisnew PropertyChangedEventArgs(propertyName));  
  44.             }  
  45.         }  
  46.     }  
  47. }  
namespace BindingDemo
{
    public class StudentData : INotifyPropertyChanged
    {
        private int _id = 0;
        private string _name = "";
        private int _age = 0;

        public int ID 
        { 
            get { return _id; } 
            set 
            { 
                _id = value;

                OnPropertyChanged("ID");
            } 
        }
        public string Name
        {
            get { return _name; }
            set 
            { 
                _name = value;
                OnPropertyChanged("Name");
            }
        }
        public int Age 
        {
            get { return _age; }
            set 
            { 
                _age = value;
                OnPropertyChanged("Age");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string propertyName)
        {
            if(PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

隐藏代码

[csharp] view plain copy
print ?
  1. public partial class Window2 : Window  
  2. {  
  3.     public Window2()  
  4.     {  
  5.         InitializeComponent();  
  6.   
  7.         Init();  
  8.     }  
  9.   
  10.     private StudentData stuData;  
  11.     public void Init()  
  12.     {  
  13.         stuData = new StudentData();  
  14.         stuData.ID = 1001;  
  15.         stuData.Name = "小明";  
  16.         stuData.Age = 18;  
  17.   
  18.         //this.DataContext = stuData;//整个窗口内的所有元素都可以绑定此数据  
  19.         stackPanel.DataContext = stuData;//仅stackPanel内的所有元素可以绑定此数据  
  20.     }  
  21.   
  22.     private void btnChang_Click(object sender, RoutedEventArgs e)  
  23.     {  
  24.         stuData.ID = 1002;  
  25.         stuData.Name = "小红";  
  26.         stuData.Age = 17;  
  27.     }  
  28. }  
    public partial class Window2 : Window
    {
        public Window2()
        {
            InitializeComponent();

            Init();
        }

        private StudentData stuData;
        public void Init()
        {
            stuData = new StudentData();
            stuData.ID = 1001;
            stuData.Name = "小明";
            stuData.Age = 18;

            //this.DataContext = stuData;//整个窗口内的所有元素都可以绑定此数据
            stackPanel.DataContext = stuData;//仅stackPanel内的所有元素可以绑定此数据
        }

        private void btnChang_Click(object sender, RoutedEventArgs e)
        {
            stuData.ID = 1002;
            stuData.Name = "小红";
            stuData.Age = 17;
        }
    }

此时运行程序点击按钮更改信息时发现用户界面显示的数据也跟着刷新了。下面的内容是对上面的数据类做的进一步封装。最终效果是一样的。


先创建一个实现INotifyPropertyChanged接口的一个抽象类基类BindableObject,数据类只需要继承此抽象基类自然就实现了接口INotifyPropertyChanged

[csharp] view plain copy
print ?
  1. namespace BindingDemo  
  2. {  
  3.     public abstract class BindableObject : INotifyPropertyChanged  
  4.     {  
  5.         public event PropertyChangedEventHandler PropertyChanged;  
  6.         protected void OnPropertyChanged(string propertyName)  
  7.         {  
  8.             if (PropertyChanged != null)  
  9.             {  
  10.                 PropertyChanged(thisnew PropertyChangedEventArgs(propertyName));  
  11.             }  
  12.         }  
  13.   
  14.         protected void SetProperty(ref T item,T value,[CallerMemberName] string propertyName=null)  
  15.         {  
  16.             if(!EqualityComparer.Default.Equals(item,value))  
  17.             {  
  18.                 item = value;  
  19.                 OnPropertyChanged(propertyName);  
  20.             }  
  21.         }  
  22.     }  
  23. }  
namespace BindingDemo
{
    public abstract class BindableObject : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        protected void SetProperty(ref T item,T value,[CallerMemberName] string propertyName=null)
        {
            if(!EqualityComparer.Default.Equals(item,value))
            {
                item = value;
                OnPropertyChanged(propertyName);
            }
        }
    }
}


[csharp] view plain copy
print ?
  1. namespace BindingDemo  
  2. {  
  3.     public class StudentData : BindableObject  
  4.     {  
  5.         private int _id = 0;  
  6.         private string _name = "";  
  7.         private int _age = 0;  
  8.   
  9.         public int ID   
  10.         {   
  11.             get { return _id; }   
  12.             set   
  13.             {   
  14.                 SetProperty(ref _id,value);  
  15.             }   
  16.         }  
  17.         public string Name  
  18.         {  
  19.             get { return _name; }  
  20.             set   
  21.             {  
  22.                 SetProperty(ref _name, value);  
  23.             }  
  24.         }  
  25.         public int Age   
  26.         {  
  27.             get { return _age; }  
  28.             set   
  29.             {  
  30.                 SetProperty(ref _age, value);  
  31.             }  
  32.         }  
  33.     }  
  34. }  
namespace BindingDemo
{
    public class StudentData : BindableObject
    {
        private int _id = 0;
        private string _name = "";
        private int _age = 0;

        public int ID 
        { 
            get { return _id; } 
            set 
            { 
                SetProperty(ref _id,value);
            } 
        }
        public string Name
        {
            get { return _name; }
            set 
            {
                SetProperty(ref _name, value);
            }
        }
        public int Age 
        {
            get { return _age; }
            set 
            {
                SetProperty(ref _age, value);
            }
        }
    }
}


[CallerMemberName]获取调用方的属性或方法名称

EqualityComparer    T为要比较的对象的类型

EqualityComparer.Default  返回一个默认的相等比较器,用于比较此泛型自变量指定的类型。

你可能感兴趣的:(WPF技术类)