WPF數據綁定-簡單對象的綁定

轉載自https://blog.csdn.net/i1tws/article/details/67655880

綁定自定義的數據類對象

在xaml代碼中,Binding標記擴展中僅定義了Path屬性,將它綁定到StudentData類的屬性上。不需要定義源對象,因爲通過指定DataContext類定義源對象。

DataContext是一個依賴屬性,它用基於FramewrokElement定義。指定相應控件的DataContext屬性表示當前控件中的每個元素都默認綁定此數據。

xaml代碼

<Window x:Class="BindingDemo.Window2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window2" Height="300" Width="300">
    <Grid>
        <!-- 簡單對象的綁定 -->
        <StackPanel Name="stackPanel" HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Vertical">
            <Label Name="lbId" Content="{Binding ID}"/>
            <Label Name="lbName" Content="{Binding Name}"/>
            <Label Name="lbAge" Content="{Binding Age}"/>
        </StackPanel>
    </Grid>
</Window>

數據類
namespace BindingDemo
{
    public class StudentData
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

隱藏代碼
    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代碼

<Window x:Class="BindingDemo.Window2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window2" Height="300" Width="300">
    <Grid>
        <!-- 簡單對象的綁定 -->
        <StackPanel Name="stackPanel" HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Vertical">
            <Label Name="lbId" Content="{Binding ID}"/>
            <Label Name="lbName" Content="{Binding Name}"/>
            <Label Name="lbAge" Content="{Binding Age}"/>
            
            <Button Name="btnChang" Content="按鈕" Click="btnChang_Click"/>
        </StackPanel>
    </Grid>
</Window>

數據類

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));
            }
        }
    }
}

隱藏代碼
    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

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<T>(ref T item,T value,[CallerMemberName] string propertyName=null)
        {
            if(!EqualityComparer<T>.Default.Equals(item,value))
            {
                item = value;
                OnPropertyChanged(propertyName);
            }
        }
    }
}


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>    T爲要比較的對象的類型

EqualityComparer<T>.Default  返回一個默認的相等比較器,用於比較此泛型自變量指定的類型。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章