天天看點

學習WPF——元素綁定

概念

從源對象提取一些資訊,并用這些資訊設定目标對象的屬性

示例

在給TextBlock控件的FontSize屬性指派時,我們使用了綁定表達式

資料綁定表達式使用XAML的标記擴充(是以具有花括号)(參見:)

這裡建立了一個System.Windows.Data.Binding對象,是以綁定表達式以單詞binding開頭

在本例中隻設定了Binding對象的兩個屬性ElementName和Path屬性

ElementName

指定源元素

Path

指定源元素中的屬性

Mode

OneWay:

當源屬性變化時,更新目标屬性

TwoWay:

當源屬性變化時,更新目标屬性,并且,當目标屬性變化時,更新源屬性

OneTime:

最初根據源屬性值設定目标屬性,其後的所有改變都會被忽略

OneWayToSource:

當目标屬性變化時,更新源屬性,源屬性變化時,目标屬性不變

Default:

根據目标屬性的設定而定

UpdateSourceTrigger

如果我們把一個屬性的值綁定到一個文本框的Text上,那麼隻有當這個文本框失去焦點時才會更新目标屬性的值;如果你想實時更新目标屬性的值該如何處理呢?那麼這時就要設定UpdateSourceTrigger屬性了,這個屬性有一下幾種可能的情況

PropertyChange:

當目标屬性發聲變化時立即更新

LostFocus:

當目标屬性發生變化,并且目标失去焦點時更新

Explicit:

除非調用BindingExpression.UpdateSource()方法,否則無法更新源

Default:

根據目标屬性的設定來确定更新行為,大多數元素都是PropertyChange設定,但TextBox.Text屬性是LostFocus設定

Delay

有的時候需要延遲一段時間再更新目标屬性的值,此時需要設定Delay屬性,機關是毫秒

Source

綁定到非元素對象;與ElementName互斥

該屬性指向源對象的引用(就是提供資料的對象)

以下代碼可以綁定到已經存在的對象

以下代碼可以綁定到已經存在的資源

RelativeSource

Self:

表達式綁定到同一進制素的另一屬性上

FindAncestor:

表達式綁定到父元素

PreviousData:

綁定到資料清單中的前一個資料項,應用在資料清單元素中

TemplateParent:

綁定到應用模版的元素,在模版内這種設定才生效

說明

除了綁定到元素的屬性,還可以綁定到元素的屬性的屬性或者存在索引器的屬性

比如:

MyElement.Property.OtherProperty

MyElement.Property[2]

當綁定到格式不正确的元素屬性上時,WPF并不會是以而編譯不通過

雙向綁定比單向綁定開銷更大,OneTime綁定比雙向綁定和單向綁定的開銷都小

盡量使用明确的綁定模式,而不要使用Default綁定模式

源屬性改變,通知到目标屬性後,目标屬性還可以作為源屬性,通知下一個目标屬性,這就是多綁定

使用代碼建立綁定

在上面的示例中完全可以使用C#代碼建立綁定

代碼如下

使用代碼删除綁定

如果像通過代碼删除某一個元素的綁定,可以通過下面兩種方式完成

使用代碼檢索綁定 

可以使用如下方式擷取一個元素的綁定對象

使用DataContext綁定

可以先對父元素設定DataContext屬性,然後在子元素中就可以輕松的使用父元素設定的DataContext所指向的對象了

修改記錄

2015-1-5:完成一部分内容

參考資料

《Pro WPF 4.5 in C# 4th Edition》