第六章 深入淺出話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));