《深入淺出WPF》學習筆記二數據綁定(Binding)、依賴屬性和附加屬性


第六章 深入淺出話Binding
   1、綁定的源可以是任意對象,並通過屬性公開自己的數據;
        綁定的目標必須是依賴對象的依賴屬性。

   2、 INotifyPropertyChanged接口,當對象實現了這個接口的時候,當數據源改變的時候可以通知UI同時實現改變,
        實現原理:當為Binding設置了數據源后,Binding會自動偵聽來自這個接口的事件。
        public event PropertyChangedEventHandler PropertyChanged;
        protected void FirePropertyChanged(string propertyName)
        {
            if(PropertyChanged!=null)
                PropertyChanged(this,new PropertyChangedEventArgs(propertyName));
        }
        然后在屬性的Set訪問器重使用
        set
            {
                if (_age != value)
                {
                    _age = value;
                    FirePropertyChanged("Age");
                }
            }
   3、依賴屬性:這類屬性的值可以通過Binding依賴在其他對象的屬性值上,被其他對象的屬性值所驅動。
   4、 綁定路徑(Path):需要綁定的值 (PropertyPath類型)
         bind.Path = new PropertyPath("Name");//設定數據綁定的路徑
         還支持多級路徑:Text={Binding Path=Text.Length,ElementName=textBox1,Mode=OneWay}
   5、 綁定模式:OneTime(初始化時的綁定,后面不會再改變)、OneWay(數據源改變UI改變,默認)TwoWay(雙向綁定)
   6、數據源(Source)的來源
        a、普通CLR類型的單個對象:自定義的類或者.NET自帶的類型;
        b、集合類型:數組、List<T>、ObservableCollection<T>等
        c、ADO.NET數據對象:DataTable和DataView等(Win8和WP都不支持)
        d、使用XmlDataProvider把XML作為數據的來源(貌似win8不支持)
        e、依賴對象(既可以作為源有可以作為綁定目標)
         f、 把容器的DataContext指定為源:我們明知道從哪個屬性獲取數據,但是不知道具體把哪個對象作為Binding源。
        g、ElementName作為數據源:元素之間的綁定
        h、使用Binding類的RelativeSource屬性:控件內部綁定(支持本身但是不支持層級相對綁定)
        i、ObjectDataProvider對象指定為Source:當數據源的數據不是通過屬性而是通過方法暴露給外界的時候。(貌似Win8不支持)
        k、把使用LINQ檢索得到的數據對象作為源。
   7、轉換器 IValueConverter
        Converter:從源到目標的轉換
        ConverterBack:從目標到源的轉換
   8、數據校驗ValidationgRule 貌似win8和wp不支持,(如果有誰研究過,望回復一起研究下)
 
第七章 深入淺出話屬性
   1、靜態字段在內存中只有一個拷貝,非靜態字段則是每一個實例擁有一個拷貝,但無論方法是靜態還是非靜態,在內存中只會有一份拷貝,區別只是你只能
        通過類名或者實例名來訪問存放指令的內存
   2、 依賴屬性:一種可以自己沒有值,可以通過Binding從數據源獲取得到值,擁有依賴屬性的對象稱為依賴對象,
           節省實例對內存的開銷
         屬性值通過Binding依賴在其他對象身上,既可以作為數據源有可以作為數據綁定目標
   3、依賴屬性對內存的使用方式:對象在創建的時候並不包含用於存儲數據的空間(即字段所占用的空間)、只保留在需要用到數據的時候能夠獲得默認值、借用
         其他對象數據或實時分配空間的能力。
         a、依賴屬性( DependencyProperty)必須以 DependencyObject為宿主,通過它的SetValue和GetValue設置和獲取值,
         b、聲明必須以   public static readonly開頭
         c、屬性成員變量的名字后面要加上Property,以表明他是一個依賴屬性
         d、使用DependencyProperty.Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata)創建而不是new,
               第一個參數用來指明用哪個CLR屬性來作為這個依賴屬性的包裝器(包裝器以實例屬性暴露依賴屬性)。
               第二個參數用來指明依賴屬性存儲什么類型的值
               第三個參數用來指明依賴屬性的宿主是什么類型

    //第一步:繼承DependencyObject
    class StudentDependency:DependencyObject
    {
 
        //第三步:使用CLR屬性作為依賴屬性的包裝器
        public string Name
        {
            get { return (string)GetValue(NameProperty); }
            set { SetValue(NameProperty, value); }
        }
        //第二步:注冊依賴屬性
        public static readonly DependencyProperty NameProperty =
            DependencyProperty.Register("Name", typeof(string), typeof(StudentDependency), new PropertyMetadata(null));
    }
   4、附加屬性:一個屬性本來不屬於某個對象,但是由於某種需求而被后來附加上,即把對象放入一個特定的環境后才具有的屬性。
         作用就是將屬性與數據類型(宿主)解耦,讓數據類型設計更加靈活
         本質還是依賴屬性,二者僅在包裝器和注冊上有點區別
       //使用的是兩個方法對屬性進行賦值
        public static int GetGrade(DependencyObject obj)
        {
            return (int)obj.GetValue(GradeProperty);
        }
 
        public static void SetGrade(DependencyObject obj, int value)
        {
            obj.SetValue(GradeProperty, value);
        }
 
       //使用的時RegisterAttached方法注冊
        public static readonly DependencyProperty GradeProperty =
            DependencyProperty.RegisterAttached("Grade", typeof(int), typeof(SchoolAttachedProperty), new PropertyMetadata(0));


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM