WPF學習筆記(一):數據綁定之元素到元素綁定

来源:http://www.cnblogs.com/legend1130/archive/2016/01/31/5173355.html
-Advertisement-
Play Games

前言 作為一隻菜鳥,之前學了一段時間的WPF,但是沒有總結,過了一學期發現好多東西都忘記了,很多東西還是需要記下來,以備後續複習。 數據綁定在事件中應用非常廣泛,可以有效地減少代碼量,那麼什麼是數據綁定?說的簡單就是從源對象提取一些信息,將其用於設置目標對象的屬性,這裡有一點需要註意,目標屬性需要是


前言

作為一隻菜鳥,之前學了一段時間的WPF,但是沒有總結,過了一學期發現好多東西都忘記了,很多東西還是需要記下來,以備後續複習。

數據綁定在事件中應用非常廣泛,可以有效地減少代碼量,那麼什麼是數據綁定?說的簡單就是從源對象提取一些信息,將其用於設置目標對象的屬性,這裡有一點需要註意,目標屬性需要是依賴屬性(Dependency Property),而源對象可以是任何內容。

數據綁定可以分為元素到元素的綁定和元素到非元素對象的綁定。

元素到元素綁定

XAML綁定

首先來看一個簡單的例子

<Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Slider Name="sldFontSize" Minimum="8" Maximum="36" VerticalAlignment="Center"></Slider>
        <TextBlock Grid.Row="1" Name="txbSampleText" FontSize="{Binding ElementName=sldFontSize, Path=Value, Mode=TwoWay}" HorizontalAlignment="Center">示例文本</TextBlock>
 </Grid>

通過改變滑動條的值可以改變文本值,這裡使用了XAML來進行數據綁定,ElementName=sldFontSize 表示綁定的源對象為上面的滑動條,Path=Value 表示源對象的屬性為滑動條的值,Mode=TwoWay 表示使用雙向綁定。這裡有四種綁定模式

BindingMode的枚舉值

 
OneWay

當源屬性變化時更新目標屬性

TwoWay

當源屬性變化時更新目標屬性,並且當目標屬性變化時更新源屬性

OneTime 最初根據源屬性值設置目標屬性,然後後續其它改變均被忽略。必要時可以減少開銷
OneWayToSource

與OneWay相同,但是方向相反

Default

此類綁定依賴於目標屬性,既可以雙向,也可以是單向,為預設值

 

 

 

 

 

 

 

使用雙向綁定需要更大的開銷,所以一般需要合理選擇綁定模式。

代碼綁定

在XAML標記中使用Binding標記拓展來聲明綁定表達式最為高效,但是有時候我們仍然需要使用代碼來創建綁定

Binding bd = new Binding();
bd.Source = sldFontSize;
bd.Path = new PropertyPath("Value");
bd.Mode = BindingMode.TwoWay;
txbSampleText.SetBinding(FontSizeProperty, bd);        

上述代碼完成的功能和用XAML創建是一樣的。但是明顯複雜不少,那麼在什麼時候需要使用代碼創建綁定呢

1.創建動態綁定:如果希望根據其他運行時信息修改綁定,或者根據環境創建不同的綁定,這時使用代碼創建綁定更合理。

2.刪除綁定:如果希望刪除綁定,從而通過普通方式設置屬性,可以使用ClearBinding()或ClearAllBinding()方法。

當然一個元素可以使用多個綁定

<Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Slider Name="sldFontSize" Minimum="8" Maximum="36" VerticalAlignment="Center"></Slider>
        <TextBlock Grid.Row="1" Name="txbSampleText" FontSize="{Binding ElementName=sldFontSize, Path=Value, Mode=TwoWay}" 
                   Foreground="{Binding ElementName=txtForeground ,Path=Text}" HorizontalAlignment="Center">示例文本</TextBlock>
        <TextBox Grid.Row="2" Name="txtForeground" FontSize="{Binding ElementName=sldFontSize, Path=Value, Mode=TwoWay}" ></TextBox>
</Grid>

截圖如下

同時綁定的時候還有何時更新的問題,大部分綁定更新都是在PropertyChanged時出發,但是應該註意TextBox.Text的預設方式是LostFocus.

PropertyChanged 當目標屬性發生變化時立即更新源
LostFocus 當目標屬性發生變化且目標丟失焦點時更新源
Explicit 除非調用BindingExpression.UpdateSource()方法,否則不更新源
Default 根據目標屬性的元數據確定更新行為(根據FrameworkPropertyMetadata.DefaultUpdateTrigger屬性)

這裡也需要根據開銷合理選擇。

綁定延遲

如果需要在更新前暫停一會,可以添加短暫的延遲時間,避免過分頻繁的觸發操作,如在代碼中添加Delay=500,即可在用戶停止輸入500毫秒後更新源對象。

綁定到非元素對象

在數據驅動的程式中,使用更多的是創建從不可見對象中提取數據的綁定表達式,唯一的要求是希望顯示的信息必須存儲在公有屬性中,此時需要放棄Binding.ElementName屬性,轉而使用以下屬性之一

  • Source:該屬性是指向源對象的引用
  • RelativeSource:使用RelativeSource指向源對象,使用此附加層可在當前元素的基礎上構建引用。
  • DataContext:如果沒有使用Source或RelativeSource屬性指定源,那麼WPF會從當前元素從元素樹上開始查找,檢查每個元素的DataContext屬性,並使用第一個非空的DataContext屬性

數據綁定在WPF技術中非常重要,下一篇文章中,我會對綁定到非元素對象進行更深入的介紹,敬請期待。

參考資料:WPF編程寶典-使用C#2012和.NET4.5(第四版)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、關於頭文件 #include <stdio.h> #import <Foundation/Foundation.h> 區別:#import指令導入更快更有效率。#include指令告訴編譯器做呆板的複製粘貼,將包含的內容粘貼到目標文件中來。而#import則會先檢查之前是否已經導入過這個文件或是
  • 1、為何引入input system? 以前我們寫一些輸入設備(鍵盤、滑鼠等)的驅動都是採用字元設備、混雜設備處理的。問題由此而來,Linux開源社區的大神們看到了這大量輸入設備如此分散不堪,有木有可以實現一種機制,可以對分散的、不同類別的輸入設備進行統一的驅動,所以才出現了輸入子系統。 輸入子系統
  • 轉自:http://www.infoq.com/cn/news/2015/12/linux-performance 如果你的Linux伺服器突然負載暴增,告警簡訊快發爆你的手機,如何在最短時間內找出Linux性能問題所在?來看Netflix性能工程團隊的這篇博文,看它們通過十條命令在一分鐘內對機器性
  • 目的:把本地上傳的圖片放置到跟目錄下的Images/Upload文件夾下。 修改步驟: 1、ueditor.config.js文件中的, imagePath: URL + "net/" 修改為: imagePath: "/" 2、net文件夾下的Config.cs文件中, public static
  • class ServicePinger { private static readonly ILog log = LogManager.GetLogger(typeof(ServicePinger)); public ServicePinger(string siteName, string sit
  • 前臺代碼: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 <div> <asp:GridView ID="GridView1" runa
  • 一個項目,一分收穫;一個項目,一些資源。Ktv項目也是一樣的,所以我想分享我的收穫,讓你們獲得你需要的資源。 一. 那MyKTV點歌系統具體的功能有哪些呢?我們就來看看吧! 1.MyKTV前臺功能: 01.歌星點歌 、拼音點歌 、數字點歌 、類型選擇 、金榜排行 02.切歌 、點歌 、重唱和退出 2
  • 近段時間,開發的需要,需要寫一個winform的程式。用VB.NET來寫。 開發開始,需要實現一個窗體設為多文檔界面 (MDI) 子窗體的容器。實現這個功能,開始找資料,得知設置一個屬性:Form.IsMdiContainer,它預設值為False,沒為True即可。 或者是form Load時添加
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...