作為乙隻菜鳥,之前學了一段時間的wpf,但是沒有總結,過了一學期發現好多東西都忘記了,很多東西還是需要記下來,以備後續複習。
資料繫結在事件中應用非常廣泛,可以有效地減少**量,那麼什麼是資料繫結?說的簡單就是從源物件提取一些資訊,將其用於設定目標物件的屬性,這裡有一點需要注意,目標屬性需要是依賴屬性(dependency property),而源物件可以是任何內容。
資料繫結可以分為元素到元素的繫結和元素到非元素物件的繫結。
首先來看乙個簡單的例子
示例文字通過改變滑動條的值可以改變文字值,這裡使用了xaml來進行資料繫結,elementname=sldfontsize 表示繫結的源物件為上面的滑動條,path=value 表示源物件的屬性為滑動條的值,mode=twoway 表示使用雙向繫結。這裡有四種繫結模式
oneway
當源屬性變化時更新目標屬性
twoway
當源屬性變化時更新目標屬性,並且當目標屬性變化時更新源屬性
onetime
最初根據源屬性值設定目標屬性,然後後續其它改變均被忽略。必要時可以減少開銷
onewaytosource
與oneway相同,但是方向相反
default
此類繫結依賴於目標屬性,既可以雙向,也可以是單向,為預設值
使用雙向繫結需要更大的開銷,所以一般需要合理選擇繫結模式。
在xaml標記中使用binding標記拓展來宣告繫結表示式最為高效,但是有時候我們仍然需要使用**來建立繫結
binding bd = new binding();上述**完成的功能和用xaml建立是一樣的。但是明顯複雜不少,那麼在什麼時候需要使用**建立繫結呢bd.source = sldfontsize;
bd.path = new propertypath("value");
bd.mode = bindingmode.twoway;
txbsampletext.setbinding(fontsizeproperty, bd);
1.建立動態繫結:如果希望根據其他執行時資訊修改繫結,或者根據環境建立不同的繫結,這時使用**建立繫結更合理。
2.刪除繫結:如果希望刪除繫結,從而通過普通方式設定屬性,可以使用clearbinding()或clearallbinding()方法。
當然乙個元素可以使用多個繫結
示例文字截圖如下同時繫結的時候還有何時更新的問題,大部分繫結更新都是在propertychanged時出發,但是應該注意textbox.text的預設方式是lostfocus.
propertychanged
當目標屬性發生變化時立即更新源
lostfocus
當目標屬性發生變化且目標丟失焦點時更新源
explicit
除非呼叫bindingexpression.updatesource()方法,否則不更新源
default
根據目標屬性的元資料確定更新行為(根據frameworkpropertymetadata.defaultupdatetrigger屬性)
這裡也需要根據開銷合理選擇。
繫結延遲
如果需要在更新前暫停一會,可以新增短暫的延遲時間,避免過分頻繁的觸發操作,如在**中新增delay=500,即可在使用者停止輸入500毫秒後更新源物件。
在資料驅動的程式中,使用更多的是建立從不可見物件中提取資料的繫結表示式,唯一的要求是希望顯示的資訊必須儲存在公有屬性中,此時需要放棄binding.elementname屬性,轉而使用以下屬性之一
WPF元素繫結筆記
利用元素到元素的繫結實現互動方式的自動化 表示式繫結中,path 可以指向屬性,也可以指向屬性使用的索引器 如content.children 0 可構建具有多級層次的路徑,使其指向屬性的屬性,以此類推 繫結錯誤不會報出異常,但是輸出視窗會有提示 繫結模式 源物件 目標物件 oneway 目標物件 ...
學習WPF 元素繫結
概念 從源物件提取一些資訊,並用這些資訊設定目標物件的屬性 示例 在給textblock控制項的fontsize屬性賦值時,我們使用了繫結表示式 資料繫結表示式使用xaml的標記擴充套件 因此具有花括號 參見 這裡建立了乙個system.windows.data.binding物件,所以繫結表示式以...
學習WPF 元素繫結
概念 從源物件提取一些資訊,並用這些資訊設定目標物件的屬性 示例 在給textblock控制項的fontsize屬性賦值時,我們使用了繫結表示式 資料繫結表示式使用xaml的標記擴充套件 因此具有花括號 參見 這裡建立了乙個system.windows.data.binding物件,所以繫結表示式以...