日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# Wpf Binding 使用详解

發布時間:2023/12/16 C# 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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}" />

在上面的代碼中,我們就用到了綁定。但是我個人建議,為了代碼簡潔,默認的屬性和默認的屬性配制不需要在代碼中重寫設置。
所有上面的代碼可以優化成下面代碼

<TextBox x:Name="sourceTBox" /> <TextBlock x:Name="tb" Text="{Binding Text,ElementName=sourceTBox}" />

綁定表達試中 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}}"/>
  • TextBlockTextTagVisibility 屬性都設置綁定表達式,這就是多綁定
  • 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
<TextBlock ><TextBlock.Text><Binding Path="Title"><Binding.RelativeSource><RelativeSource Mode="FindAncestor" AncestorType="{x:Type Window}" AncestorLevel="1" /></Binding.RelativeSource></Binding></TextBlock.Text> </TextBlock><!--以上代碼可以簡寫成如下--><TextBlock Text="{Binding Title,RelativeSource={RelativeSource Mode=FindAncestor,AncestorLevel=1,AncestorType={x:Type Window}}}" /><!--一般一個窗口只有一個Window 對像,可以再次簡寫--><TextBlock Text="{Binding Title,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}}}" />
  • 綁定到自身 Mode="Self"
<TextBlock ><TextBlock.ToolTip><Binding Path="Text"><Binding.RelativeSource><RelativeSource Mode="Self" /></Binding.RelativeSource></Binding></TextBlock.ToolTip> </TextBlock><!--以上代碼可以簡寫成如下--><TextBlock Text="{Binding Text,RelativeSource={RelativeSource Mode=Self}}" />
  • 綁定到列表數據中的前一個數據項 Mode="PreviousData"
<TextBlock ><TextBlock.ToolTip><Binding Path="Text"><Binding.RelativeSource><RelativeSource Mode="PreviousData" /></Binding.RelativeSource></Binding></TextBlock.ToolTip> </TextBlock><!--以上代碼可以簡寫成如下--><TextBlock Text="{Binding Text,RelativeSource={RelativeSource 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 。
<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="{TemplateBinding Background}"><StackPanel Orientation="Horizontal"><Image x:Name="img" Source="{TemplateBinding Tag}"/><TextBlock x:Name="txt" Text="{TemplateBinding Content}"/></StackPanel></Border></ControlTemplate></Setter.Value></Setter></Style></Button.Style></Button>

綁定表達式的代碼明顯簡潔了很多。

DataContent屬性

<TextBlock Text="{Binding Version}" />

Wpf就從當前元素開始在元素樹中向上查找。檢查每一個元素的DataContent屬性,并使用 第一個非空的DataContent 屬性 所引用的對像的 Version 屬性。
如果 TextBlock的Text 直到 Window 對像DataContent 屬性引用一個對像不為空,TextBlock的Text 就綁定到 Window 對像DataContent 屬性引用對像的 Version 屬性上。

//Window 對像DataContent 屬性引用對像 SystemVersionpublic class SystemVersion{public int Code { get; set; }public String Version { get; set; }}//設置 Window 對像DataContent 屬性this.DataContext = new SystemVersion(){Code = 103,Version = "V1.0.3"};

綁定代碼

<TextBlock Text="{Binding Version}" />

三、 總結

  • 文章中許多話語是根據自己在項目開發時使用的理解,可能表述不當或者錯誤,希望得到指出。
  • 數據綁定是開發一個應用必不可少的東西。不用數據綁定也可開發一些應用程序。但在有些情況,不用數據綁定可以就不好實現,甚至無法實現 ,如:列表渲染,自定義控件,組件開發等。

總結

以上是生活随笔為你收集整理的C# Wpf Binding 使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。