這篇文章主要給大家介紹了關於WPF基礎教程之元素綁定的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友們下面隨着小編來一起學習學習吧
前言
簡單的說,數據綁定是一種關係,該關係告訴WPF從一個源對象提取一些信息,並使用這些信息設置目標對象的屬性。目標屬性總是以來屬性,並且通常位於WPF元素中,畢竟,WPF數據綁定的最終目的是在用戶界面中顯示一些信息。然而,源對象可以是任何內容,從另一個WPF元素到ADO.NET數據對象(如DataTable和DataRow對象)或自己創建的純數據對象。
下面話不多說了,來一起看看詳細的介紹吧
元素綁定
數據綁定最簡單的形式是源對象是WPF元素而且源屬性是依賴項屬性。依賴項屬性具有內置的更改通知支持。因此當源對象中改變依賴屬性的值時,會立即更新目標對象中的綁定屬性。
綁定表達式
當使用綁定表達式時,不必對源對象做任何改動,只需配置源對象使其屬性具有正確的值範圍。
<Slider Grid.Row="0" Name="sliderFontSize" Margin="3" Minimum="1" Maximum="40" Value="10" TickFrequency="1" TickPlacement="TopLeft"> </Slider> <TextBlock Grid.Row="1" Margin="10" Text="Simple Text" Name="lblSimpleText"FontSize="{Binding ElementName=sliderFontSize,Path=Value}"> </TextBlock>
綁定錯誤
WPF不會引發異常來通知與數據綁定相關的問題。如果指定的元素或屬性不存在,那麼不會收到任何的指示;相反,只是不能在目標屬性中顯示數據。
調試可通過Visual Studio的OutPut窗口查看,WPF會輸出綁定細節的跟蹤信息。
綁定模式
名稱 | 說明 |
OneWay | 當源屬性變化時更新目標屬性。 |
TwoWay | 當源屬性變化時更新目標屬性,並且當目標屬性變化時更新源屬性。 |
OneTime | 最初根據源屬性設置目標屬性,然而,其後的所有改變都會被忽略。通常如果知道屬性不會變化,可通過這種模式降低開銷。 |
OneWayToSource | 與OneWay相反,當目標屬性變化時更新源屬性。 |
Default | 此類綁定依賴於目標屬性,既可以是雙向的,也可以是單向的。除非明確指定了一種綁定模式,否則所有綁定使用該方法 |
使用代碼創建綁定
Binding binding = new Binding(); binding.Source = sliderFontSize; binding.Path = new PropertyPath("Value"); binding.Mode = BindingMode.TwoWay; lblSimpleText.SetBinding(TextBlock.FontSizeProperty,binding);
多綁定
可以設置TextBlock元素從文本框中獲取文本,從單獨的顏色列表中選擇當前前景色和背景色,等等。
<TextBlock Grid.Row="1" Margin="10" Name="lblSimpleText" FontSize="{Binding ElementName=sliderFontSize,Path=Value}" Text="{Binding ElementName=txtContent,Path=Text}" Foreground="{Binding ElementName=lstColors,Path=SelectedItem.Tag}"> </TextBlock>
還可鏈接數據綁定。例如TextBox.Text屬性創建表達式以鏈接到TextBlock.FontSize屬性,而TextBlock.FontSize又鏈接到Slider.Value屬性的綁定表達式。
綁定更新
源的變化會立即影響目標,然而反向的傳遞從目標到源未必會立即發生。他們的行爲由Binding.UpdateSourceTrigger屬性控制。
名稱
|
說明
|
PropertyChanged | 當目標屬性變化時立即更新源。 |
LostFocus | 當目標屬性變化並且目標屬性失去焦點時跟新源。 |
Explicit | 除非調用BindingExpression.UpdateSource()方法,否則無法更新源。 |
Default | 根據目標屬性的元素確定更新行爲。大多數屬性的默認行爲是PropertyChanged,但TextBox.Text屬性的默認行爲是LostFocus |
表中列出的值不影響目標的更新方式,他們僅控制OneWay或OneWayToSource模式的綁定中源的更新方式。
綁定延遲
用戶停止輸入500毫秒後更新源對象
<TextBox Text="{Binding ElementName=txtSampleText,Path=FontSize,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,Delay=500}" Name="txtFontSize"> </TextBox>
綁定到非元素對象
WPF數據綁定基礎結構不能獲取私有信息或公有字段,必須是公有屬性中。
綁定到非元素對象時,需要放棄Binding.ElementName屬性,並使用以下屬性之一。
- Source:該屬性是指向源對象的引用,提供數據的對象。
- RelativeSource:這是引用,使用RelativeSource對象指向源對象。有了這個附加層,在在當前元素的基礎上構建引用。這似乎增加了複雜程度,
但實際上RelativeSource屬性是一種特殊工具,當編寫控件模版及數據模版時是很方便的。
- DataContext:如果沒有使用Source或RelativeSource屬性指定源,WPF就從當前元素開始在元素樹中向上查找。檢查每個屬性的DataContext屬性,並使用第一個飛空的DataContext屬性。
當將同一個對象的多個屬性綁定到不同的元素時,DataContext屬性是非常有用的,因爲可在更高層次的容器對象上,設置DataContext屬性。
Source
綁定到靜態對象
<TextBlock Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=Source}"></TextBlock>
2.綁定到資源
<Window.Resources> <FontFamily x:Key="CoustomFont">Calibri</FontFamily> </Window.Resources> <Grid> <TextBlock Text="{Binding Source={StaticResource CoustomFont},Path=Source}"></TextBlock> </Grid>
RelativeSource
<TextBlock Text="{Binding Path=Title,RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}}}"></TextBlock>
RelativeSource對象使用FindAncestor模式,該模式告知查找元素樹知道發現AncestorType屬性定義的元素類型。
FindAncestor模式有4種。
名稱
|
說明
|
Self | 表達式綁定到同一元素的另一個屬性上。 |
FindAncestor | 表達式綁定到父元素。WPF將查找元素樹直至發現期望的父元素。爲了指定父元素,還必須設置AncestorType屬性以指示希望查找的父元素類型。此外,還可以用AncestorLevel屬性略過發現的一定的數量的特定元素。例如當一棵樹中查找時,如果希望綁定到第三個ListBoxItem類型的元素,應當使用如下設置,AncestorType={x:Type ListBoxItem};並且AncestorLevel=3,從而略過前連個ListBoxItem元素。默認值是1,並在找到第一個匹配的元素停止查找。 |
PreviousData | 表達式綁定到數據綁定列表中前一個數據項。在列表中使用這種模式。 |
TemplateParent | 表達式綁定到應用模版的元素。只有當綁定位於控件模版或數據模版內部時,這種模式才能工作。 |
DataContext屬性
大量元素綁定到同一對象。
<TextBlock Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=Source}"></TextBlock> <TextBlock Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=Source}"></TextBlock> <TextBlock Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=Source}"></TextBlock>
可以改成如下
<StackPanel DataContext="x:Static SystemFonts.IconFontFamily"> <TextBlock Text="{Binding Path=Source}"></TextBlock> <TextBlock Text="{Binding Path=Source}"></TextBlock> <TextBlock Text="{Binding Path=Source}"></TextBlock> </StackPanel>
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對神馬文庫的支持。