C# Wpf Binding 使用详解
C# Wpf Binding (元素綁定)使用詳解
簡單的說 數據綁定 是一個關系,該關系告訴WPF 從源對像提取一些信息,并用這些信息設置目標對像的屬性。
在目標對像中,被設置綁定的屬性必須是 依賴項屬性,通常在WPF 元素中。
注意:
盡管從元素到元素的綁定是最簡單的方,但是在真正的項目開發中,大量的數據綁定是將元素x綁定到數據對像。從而可以顯示 從 數據庫或者文件 中提取的數據。
從元素到元素的綁定通常應用于元素的交互方式自動化,用戶自定義控件。
一、 綁定到元素
1 綁定表達式
使用 xaml 標記拓展(也就是用{}語法)。2 弄清 源對像、目標對像 、目標屬性
<TextBox x:Name="sourceTBox" /><TextBlock x:Name="tb" Text="{Binding ElementName=sourceTBox,Path=Text}" />在上面的代碼中,我們就用到了綁定。但是我個人建議,為了代碼簡潔,默認的屬性和默認的屬性配制不需要在代碼中重寫設置。
所有上面的代碼可以優化成下面代碼
綁定表達試中 Path 屬性被省略, Path=Text 簡寫成 Text。為什么可以這樣簡寫,是因為 Binding 類中有一個 帶Path 的構造方法。
- 源對像
指 綁定表達式中 ElementName 屬性所批向的元素,即 TextBox 為源對像(注:Binding的Source屬性 和 Binding的RelativeSource屬性指向的對像,也是源對像) - 目標對像
指 包含綁定表達式的元素 ,即 TextBlok 為目標對像 - 目標屬性
指 屬性的值設置了綁定表達式,這個屬性就是 目標屬性
3 綁定錯誤
Wpf 不會引發異常來通知與數據綁定相關的問題,如果綁定的屬性不存在,不會收到任何提示,也不能在目標屬性顯示任何值。
WPF 綁定失敗細節的跟蹤信息會在 輸出窗口 顯示
WPF 綁定失敗細節的跟蹤信息會在 輸出窗口 顯示
WPF 綁定失敗細節的跟蹤信息會在 輸出窗口 顯示
如果要在控件中 顯示 參考 Binding 的 TargetNullValue 屬性
<TextBlock x:Name="tb" Text="{Binding Text,ElementName=sourceTBox,Mode=TwoWay},TargetNullValue='has error'" />4 綁定模式
當設置 Binding.Mode 屬性時。WPF 允許使用 5 個 system.windows.data.BindingMode 枚舉值中的任何一個。代碼如下,其中的 Mode=TwoWay 就是設置綁定模式
<TextBlock x:Name="tb" Text="{Binding Text,ElementName=sourceTBox,Mode=TwoWay}" />system.windows.data.BindingMode 枚舉值:
| OneWay | 當源屬性變化時更新目標屬性 |
| TwoWay | 當源屬性變化時更新目標屬性 ,當目標屬性 變化時更新源屬性 |
| OneTime | 最初設定源屬性時更新目標屬性,后期的變化都被忽略 ,如果知道源屬性不會變化,可以使用這種模式,降低開銷 |
| OneWayToSource | 與OneWay 類似,但方向相反,當目標屬性變化時更新源屬性,有點向后傳遞,但目標屬性永遠不會被更新 |
| Default | 此類綁定依賴于目標屬性,即可以是雙向(對于用戶可以設置的屬性,如TextBlock.Text,) 也可以是單向,除非明確指明一種模式,否則都采用此種模式 |
5 CS 代碼中使用 Binding
Binding binding = new Binding();binding.Source = this.sourceTBox; //指向源對像 this 指向的當前的Window 對像 的 sourceTBox 對像 ,sourceTBox 是對像的名稱,即(x:Name="**")//binding.Source = this; //指向源對像 this 指向的當前的Window 對像 ,也可binding.Path = new PropertyPath("Text");this.tb.SetBinding(TagProperty, binding);使用 BindingOperations
Binding binding = new Binding(); binding.Path = new PropertyPath("Text"); //BindingOperations.SetBinding(this, TitleProperty, binding); BindingOperations.SetBinding(this,TitleProperty,binding);使用代碼 獲取綁定
Binding binding = BindingOperations.GetBinding(this.tb, TextBlock.TextProperty); //獲取綁定以后可以修改 bindig 的屬性 //binding.Mode = BindingMode.TwoWay; //... //修改過后可以重先設置綁定 //BindingOperations.SetBinding(this.tb,TextProperty,binding);更實用的 BindingExpression 對像
BindingExpression expression = BindingOperations.GetBindingExpression(this.tb, TextBlock.TextProperty);//get source element 獲取源對像 TextBox textBox =(TextBox) expression.ResolvedSource;//get any data you need from the source elementstring name = textBox.Name;// expression.ResolvedSource 獲取綁定對像的引用BindingExpression 更加實用的信息,去源碼里查看
6 多綁定 (多屬性綁定)
<CheckBox x:Name="cb1" Visibility="Collapsed" IsChecked="False" HorizontalAlignment="Center" VerticalAlignment="Center" Width="50" Height="30" BorderThickness="0" IsVisibleChanged="cb1_IsVisibleChanged" /><TextBox x:Name="sourceTBox" /><TextBlock x:Name="tb" Text="{Binding Text,ElementName=sourceTBox,Mode=TwoWay}" Tag="{Binding Content ,ElementName=cb1,Mode=OneWay}"Visibility="{Binding IsChecked,ElementName=cb1,Converter={StaticResource Boolean2VisibilityConverter}}"/>- TextBlock 的 Text 、Tag 、Visibility 屬性都設置綁定表達式,這就是多綁定
- Visibility 屬性民的綁定表達式 用到了 轉換器,轉換器的相關知識,另行學習。
7 綁定更新
使用代碼
<TextBlock x:Name="tb" Text="{Binding Text,ElementName=sourceTBox,Mode=TwoWay,UpdateSourceTrigger=Default}"UpdateSourceTrigger 枚舉值
| PropertyChanged | 屬性發生變化時更新 |
| LostFous | 失去焦點時更新 |
| Explicit | 調用 BindingExpress.UpdateSource()時更新 |
| Defeat | 根據屬性的元數據確定更新行為(FrameworkPropertyMetadata.DefaultUpdateSourceTriggere) 大多數默認行為 是PropertyChanged 但TextBox.Text 默認行為是 LostFocus |
8 延遲綁定
作用 :避免過分頻繁的觸發操作,導致頻繁更新UI。
使用 Binding 對像的 Delay 屬性。等待數毫秒之后再提交更新。
使用代碼
<TextBlock x:Name="tb" Text="{Binding Text,ElementName=sourceTBox,Mode=TwoWay,Delay=500}" />500 毫秒后再更新。
二、 綁定到非元素對像
在項目開發中,大量的數據綁定是將元素達到到數據對像。從而可以顯示 從 數據庫或者文件 中提取的數據,從而需要綁定到非元素的對象中。
- 綁定到非元素的對象時,需要 放棄 TargetElement 屬性。
- 綁定到非元素的對象時,使用以下屬性的其中一個。
– Soure:該屬性是指向源對像的引用(數據的對像)
– RelativeSource:這是引用,使用RelativeSource 對像指向源對像 RelativeSource是一種特殊的工具,在編寫控件模板和數據模板是很方便。
– DataContent:如果沒有使用Source和RelativeSource 指定源,Wpf就從當前元素開始在元素樹中向上查找。檢查每一個元素的DataContent屬性,并使用 第一個非空的DataContent 屬性。當我們在要同一個對像綁定不同元素時 DataContent屬性 是非常有用的。
Source 屬性
使用代碼
<TextBlock Text="{Binding Source,Source={x:Static SystemFonts.CaptionFontFamily}}"/>第一個 Source 是 Path 屬性的值
RelativeSource 屬性
RelativeSource 屬性可以根據相對目標對像的關系指向源對像,例如,可以使用RelativeSource 屬性將元素綁定 自身 或 父元素。
設置 Binding.RelativeSource 屬性 需要 RelativeSource 對像。語法會變得更加復雜。
- 綁定到父元素 Mode=FindAncestor
- 綁定到自身 Mode="Self"
- 綁定到列表數據中的前一個數據項 Mode="PreviousData"
此時 Path=Text ,Text 是數據列表中的前一個對像的屬性,不一定是依賴項屬性,這種模式只會在列表中使用
以上代碼不是真實使用時的代碼,只是說明 寫法。
- 綁定到應用模板元素 Mode="TemplatedParent"
只有當綁定位于控件模板() 或 數據模板() 內部時,這種模式才能工作。
<Button x:Name="Btn1" Content="Button" Background="Blue" Tag="/themes/img/snend.png"><Button.Style><Style TargetType="Button"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Border x:Name="PART_border" Background="{Binding Background,RelativeSource={RelativeSource Mode=TemplatedParent}}"><StackPanel Orientation="Horizontal"><Image x:Name="img" Source="{Binding Tag,RelativeSource={RelativeSource Mode=TemplatedParent}}"/><TextBlock x:Name="txt" Text="{Binding Content,RelativeSource={RelativeSource Mode=TemplatedParent}}"/></StackPanel></Border></ControlTemplate></Setter.Value></Setter></Style></Button.Style></Button>TemplateBindingExtension 對像
我們可以如下理解:
- TemplateBindingExtension 對像 是 RelativeSource.Mode=TemplatedParent ,簡化寫法拓展。
- TemplateBinding 和 binding 有一個共同的祖先 MarkupExtension,只是在使用
TemplateBindingExtension 對像是 結尾的Extension 是可以省去。這只是一個命名的問題,binding
繼承 BindingBase ,BindingBase 又繼承自 MarkupExtension,binding 對像的命名也可以命名成 - BindingExtension。 TemplateBinding 和 binding 都是用來做數據綁定的。
- TemplateBindingExtension 就是 TemplateBinding 。
綁定表達式的代碼明顯簡潔了很多。
DataContent屬性
<TextBlock Text="{Binding Version}" />Wpf就從當前元素開始在元素樹中向上查找。檢查每一個元素的DataContent屬性,并使用 第一個非空的DataContent 屬性 所引用的對像的 Version 屬性。
如果 TextBlock的Text 直到 Window 對像DataContent 屬性引用一個對像不為空,TextBlock的Text 就綁定到 Window 對像DataContent 屬性引用對像的 Version 屬性上。
綁定代碼
<TextBlock Text="{Binding Version}" />三、 總結
- 文章中許多話語是根據自己在項目開發時使用的理解,可能表述不當或者錯誤,希望得到指出。
- 數據綁定是開發一個應用必不可少的東西。不用數據綁定也可開發一些應用程序。但在有些情況,不用數據綁定可以就不好實現,甚至無法實現 ,如:列表渲染,自定義控件,組件開發等。
總結
以上是生活随笔為你收集整理的C# Wpf Binding 使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Syclover-Web题解
- 下一篇: char知识解析