日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

WPF實現數據綁定_實用技巧

作者:痕跡g ? 更新時間: 2022-04-07 編程語言

簡單而言, 數據綁定是一種關系, 這種關系告訴WPF 從一個源目標對象中提取一些信息, 并且使用該信息設置為目標對象的屬性。目標屬性總是依賴項屬性, 并且通常位于WPF元素中。

然而, 源對象可以是任何內容, 可是是隨機生成的一個對象、也可以是數據庫的數據對象,或者手動創建的對象。

簡單綁定

為了能夠簡單理解這種綁定關系, 接下來簡單示例, 用一個數值滾動條, 動態修改一個文字的字體大小, 通過綁定的方式。

<StackPanel>
    <Slider Name="s1" Value="10" Maximum="100"></Slider>
 
    <TextBlock FontSize="{Binding ElementName=s1,Path=Value}" Text="看著我" ></TextBlock>
</StackPanel>

上圖中, TextBlock的字體大小FontSize通過綁定的形式與名稱為s1的元素的Value屬性綁定。

注:數據綁定表達式使用了XAML標記擴展, 所以綁定表達式以單詞Binding 開頭。該示例中設置的兩個屬性: ElementName(源對象元素) 和Path(源對象元素中的屬性)。

運行測試效果:

綁定錯誤

WPF不會引發異常來通知與數據綁定相關的問題, 如果指定的元素不存在或錯誤, 不會收到任何提示, 最簡單的只是目標的屬性無法發生改變, 不過, WPF仍然會在輸出窗口顯示其綁定失敗的具體細節。

綁定模式

在上面的示例中, 只是一個最簡單的綁定, 我們可以假設一個環境, 在上面的例子基礎上另外加一個按鈕, 去單獨實現字體的大小設置, 然而拖動條并不會隨著按鈕設置的字體大小而改動。

但是在實際應用中, 我們甚至會用到的多種綁定模式, 所以在WPF中, 含有5種綁定的模式, 包含在System.Windows.Data.BindingMode枚舉中。

OneWay 當源屬性變化時更新目標屬性
TwoWay 當源數據變化時更新目標屬性, 并且當目標屬性變化時更新源屬性
OneTime 最初根據源屬性值設置目標屬性。然而, 在此之后的所有改變都會被忽略(除非綁定被設定為一個完全不同的對象或者調用BindingExpression.UpdateTarget()方法, 如稍后所介紹的那樣)。通常, 如果知道源屬性不會變化, 可以使用這種模式降低開銷。
OneWayToSource 和OneWay 類似, 但是方向相反。當目標屬性變化時更新源屬性(這看起來有點像向后傳遞),但目標屬性永遠不會更新。
Default 此類綁定依賴于目標屬性。它既可以是雙向的(對于用戶設置的屬性, 如Textbox.Text屬性),也可以是單向的(對于所有其他屬性)。除非明確指定了另外一種模式, 否則所有綁定都使用該方法。

在此, 對于OneTime設置過一次就無效,和默認default模式就不過多介紹, 下面對其他集中進行簡單分析:

利用代碼進行數據綁定

下面代碼演示如何將上面的示例進行綁定:

private void Window_Loaded(object sender, RoutedEventArgs e)
 {
     Binding bind = new Binding();
     bind.Source = s1; //指定源對象
     bind.Mode = BindingMode.Default; //設置綁定模式
     bind.Path = new PropertyPath("Value");  //關聯綁定的屬性
     txtfont.SetBinding(TextBlock.FontSizeProperty, bind);  //綁定對象
 }

下面代碼演示如何解除數據綁定:

private void Window_Loaded(object sender, RoutedEventArgs e)
  {
      //刪除指定目標對象的  指定屬性數據綁定
      BindingOperations.ClearBinding(txtfont, TextBlock.FontSizeProperty);
 
      //刪除指定目標對象的所有數據綁定
      BindingOperations.ClearAllBindings(txtfont);
  }

注意:以上的兩個移除數據綁定的方法, 可以刪除任何形式的綁定, 無論是代碼創建的綁定還是通過XAML標記的綁定。

綁定更新:

在上面的示例中, 從 源對象 -> 目標對象, 源對象的值發生改變, 目標會立刻響應。但是從目標 > 源 , 未必會立即發生。

在WPF中,他們的行為右? binding中的?UpdateSourceTrigger屬性控制, 關于UpdateSourceTrigger 下面列出了對應的枚舉值?

propertyChanged 當目標屬性發生變化時立即更新源目標
LostFocus 當目標屬性發生變化時并且目標丟失焦點是更新源目標
Explicit 除非調用BindingExpression.UpdateSource()方法,否則無法更新資源
Default 根據目標屬性的元數據確定更新行為, 大多數屬性的默認行為是PropertyChanged, 但是TextBox.Text的屬性默認行為是LoastFocus

示例, 對于TextBox控件, 添加?UpdateSourceTrigger=PropertyChanged 以達到更新源目標, 但是往往在實際應用中, TextBox會頻繁的變化, 從而導致多次更新源目標,?

PropertyChenged更新反而會是應用程序運行更加緩慢, 要完全控制源對象的更新時機, 可以選擇 Explicit模式, 例如, 添加一個按鈕, 在按鈕中調用UpdateSource方法已達到

更新的目的。

<TextBlock Grid.Row="1" Text="看著我" Name="txtfont"></TextBlock>
<TextBox Grid.Row="2" Margin="10" Text="{Binding ElementName=txtfont,Path=FontSize,UpdateSourceTrigger=PropertyChanged}"></TextBox>

注:在調用UpdateSource之前, 需要通過GetBindingExpression()方法獲取到BindingExpression對象, 從而調用UpdateSource()方法。

private void Button_Click(object sender, RoutedEventArgs e)
   {
       BindingExpression exp = txtfont.GetBindingExpression(TextBlock.FontSizeProperty);
       exp.UpdateSource();
   }

非元素綁定:

在上面的例子中, 一直圍繞著元素之間的綁定, 以及一些綁定的模式的介紹, 但是在我們的實際應用當中, 更多的是于數據打交道, 就像常見的Grid表格, 需要綁定對應數據庫表的每個字段。

當綁定一個非元素對象時候, 這個時候就不能使用 ElementName屬性, 在WPF中, 提供了多種屬性以在實際應用中選擇:

Source 提供數據的對象本身
RelativeSource 使用RelativeSource對象指向源目標,
DataContext 從當前元素向下, 找到第一個非空的DataContext屬性。

Source屬性:

如下, 我們定義了一個Custom的資源對象, 同時創建了一個TextBlock對象用Source進行了對象綁定, 此時, TextBlock顯示的Text則為Tom

<Window.Resources>
        <FontFamily x:Key="Custom">Tom</FontFamily>
    </Window.Resources>
 
    <StackPanel>
        <TextBlock Text="{Binding Source={StaticResource Custom},Path=Source}" Height="30"/>
    </StackPanel>

RelativeSource屬性:

如下, 定義了一個RelativeSource對象, ?Mdoe選擇了FindAncestor(該模式通知元素直到發現AncestorType定義的元素類型,如下類型為 window),選擇的Paht為title屬性

<StackPanel>
        <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}},Path=Title}" Height="30"/>
    </StackPanel>

DataContext屬性:

TextBlock綁定了DataContext屬性, WPF會在元素樹種,找到第一個不為null的數據上下文, 此時后臺需要對DataContext進行綁定指定的上下文對象。

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

該示例種, 綁定了自身為上下文對象, 所有TextBlock找到的第一個Width屬性為windows窗體本身的Width屬性

private void Window_Loaded(object sender, RoutedEventArgs e)
   {
       this.DataContext = this;
   }

原文鏈接:https://www.cnblogs.com/zh7791/p/9015775.html

欄目分類
最近更新