目錄
一、控制元件與布局
二、Binding基礎
前言
“一橋飛架南北, 天塹變通途”
寫于1956年,1957年武漢長江大橋建成, 稱之為:一橋飛架南北,大塹變通途.它形象地描述武漢長江大橋的雄偉氣勢及其在我國南北交通方面發揮的重要作用,
哈哈,為什么要說這么一句無頭理的話呢?
Binding一詞,第一反應給我們以“系結”的涵義,錯了錯了~~
Binding就好像一個“橋梁”
額……對沒錯,就是橋梁,Bind 一詞在做動詞時,實際上具有關聯的含義,
也就是說Binding更注重表達它是一種像橋梁一樣的關聯關系
我們通過Binding完成UI層與邏輯層的資料互動, 當邏輯層的屬性發生變動時,會通知Binding,當Binding知道是哪個屬性變動后,通知給UI端相關聯的控制元件,完成相應動作,
屬性是怎么發出通知的?
屬性
快捷鍵“propf”
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
屬性是沒有辦法發出通知的,比如我我把值改為了3,它是不會去通知別人說:“看!我變成小3了!!”,
它要是會通知的話,那真是“見鬼了!”,
讓屬性說話的魔法(INotifyPropertyChanged)
我們是偉大的程式猿,想讓屬性說話還不簡單,我們有魔法!
INotifyPropertyChanged 介面
譯為“屬性變化時通告”
我們創建一個Student類實作這個介面,
發現它實作了一個事件“PropertyChanged”,
“說話的能力”PropertyChanged
介面默認實作了一個事件,
這個事件怎么用呢?在哪里執行呢?
- 我們知道是當“屬性的值發生改變時去通知”,
- 在屬性里賦值為set方法 ,所以我們的事件在set方法體里實行,
我這里用了事件執行的一個語法糖,意思是 “不為空時就執行事件(?.Invoke())”,
當是,你可能更常見的是這種
PropertyChanged的引數
第一個引數也就是觸發這個事件的物件(this),第二個引數實際上告訴是哪個屬性發生了變化(new PropertyChangedEventArgs(propName)),所以是個字串,表示當前屬性的名稱,
好吧!!屬性有了能力呢,那么是怎么Binding(關聯)的呢?
C#里的Binding
一、首先,我們在頁面放置一個文本框和一個按鈕,要實作點擊按鈕時:文本框的內容隨著Binding的屬性的值改變而發生改變,
給文本的Name賦值為“txt1”,給按鈕添加一個點擊事件(先像winform那樣,找到控制元件的屬性-》事件里去添加)
二、在表單的后臺代碼里,初始化,系結Binding
沒錯,我們并沒有去操作什么,只是讓學生的姓名變化,文本框就自動變化了,這就是Binding,
在這里我們衍生出幾個知識點:
“問渠哪得清如許,為有源頭活水來”
設問:這“半畝方塘”為什么這么清澈呢?并自答:因為有這源頭活水不斷地補充進來,才使得它這么清澈,——朱熹的《觀書有感》
就好像我們的程式為什么這么有活力呢,正是因為有好的源頭(水源),還有路徑(水流的道路),
1、Source(資料源)
Binding對資料源的要求并不是那么苛刻,只要它是一個物件,并且通過屬性公開自己的資料(set;get;),它就能作為Binding的源,
就好像我們把Student的當作資料源,Student的通過公開屬性(Name)讓我們拿到資訊,
2、Path(路徑)
資料公開了,我們怎么拿到呢?
我們需要通往它的道路(Path),Binding的Path是一個PropertyPath型別,引數是一個string,也就是屬性的名稱(Name),
我們把屬性的名稱來當作訪問的路徑,
3、Binding 怎么和控制元件關聯
我們已經實體化好了一個Binding,并且設定了Source和Path,現在,我們需要將它與文本框關聯,
BindingExpressionBase.SetBinding(DependencyObject target, DependencyProperty dp, BindingBase binding)
引數:
- target:系結的系結目標,
- dp:系結的目標屬性,
- binding: 描述系結的 System.Windows.Data.BindingBase 物件,
三、Binding的簡寫方法
1、this.name.SetBinding()
2、new Binding(){}
xaml里的Binding
一、建構式改變一下
我們這里使用文本框的DataContext賦值資料源,而不是用Binding的Source.
因為在xaml代碼里去binding一個Source是很麻煩的事情,而且,一般只有靜態資源,或者是以控制元件的數值為資料源時,我們才在xaml代碼里去BindingSource(這個輪到后面展示)
DataContext資料背景關系
- 當一個Binding沒有Source時,會發生什么了?它會把當前物件的DataContext作為資料源,
- DataContext屬性定義在FrameworkElement類里,這個類是WPF控制元件的基類,這就意味著,所有控制元件都有這個屬性,
- 如果當前對像的DataContext為空,它就會像它的父容器”借“一下,
所以也可以寫成這樣
二、撰寫xaml代碼
三、XAML中Binding寫法的解釋
- Text=“{Binding Path=Name }”
- 解讀:并不是為Text賦了一個Binding的值,
- 應該是為TextBox的屬性Text關聯(Binding)了一個資料源,可以把這看成一個 Binding的建構式,相當于初始化Binding
還記得一開始的寫法嘛
Binding靜態資源和控制元件
1、關聯靜態資源
Resource
每個控制元件都有一個 Resource屬性,我們可以在里面存放資源,方便訪問,
在這里我們實體化了一個Student,并且設定了一個key=“student”,
Source={StaticResource student}
通過StaticResource訪問靜態資源,通過key來確定關聯哪個資料源,
2、關聯控制元件
我們來實作一個效果,當滑動進度條時,文本顯示滑動的值,文本框輸入值,進度潭訓動到合適的位置,
(方法一)放置倆個控制元件,在C#里關聯控制元件
我們會發現只有當文本框的值失去焦點時,進度條的顯示才會變化,我們來設定一下: UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged(當值發生變化時就觸發)
(方法二)放置倆個控制元件,在xaml里關聯控制元件
就是這么簡單,我們這里使用的時elementname來系結是哪個控制元件,你看Binding的樣式,是不是特別像建構式初始化
BindingPath的“/”用法
當我們資料源的一個屬性是一個集合時,我們需要集合里的子元素,怎么去Path指定呢?
我們在創建一個班級類,班級類有一個Name屬性,還有一個Student集合,代表有多個學生,
如果資料源的屬性是一個集合,要把集合中的子元素當作Path,使用多斜線的語法,一路“斜下去”,
結尾
呼,Binding的用法實在太多了,剩下的資料校驗和資料轉換,下期在做,當然我總結的可能很懶散,但是我是盡量再用白話文來解釋,一定要多動手嘗試,你就會發現Binding的樂趣所在,
“你不能擁有的,別人替你去擁有”
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/233733.html
標籤:.NET技术
下一篇:C#高級特性(反射)
