網站首頁 編程語言 正文
什么是綁定(Binding)?
在winform中, 我們常常會用到各種類型的賦值, 例如:
- button1.Text="Hello";
- label.Text="Hello";
- ...
類似這種賦值操作, 我們之所以不稱之為綁定, 主要原因是因為他們大多數操作都是一次性的, 無論是數據還是按鈕本身發生變化,對兩者而言都是不可見的。
而綁定的概念則側重于: 兩者的關聯,協議與兩者之間的影響。
首先, 從一個簡單的例子來理解什么是綁定。
創建一個滑塊控件, 并且希望在滑動的過程中, 把值更新到另外一個靜態文本上。代碼如下:
在winform中, 我們常規的做法會給滑塊創建一個值改變事件,同時將滑塊的值賦值給文本。
接下來, 我只需要在靜態文本中添加一小段綁定的聲明,即可完整原本很復雜的操作:
Text={Binding ElementName=slider,Path=Value}
- {Binding }: Binding的聲明語法, 一對尖括號,開頭聲明以Binding 開始。
- ElementName= : 該聲明意為, 設置元素的名稱
- Path: 設置關聯元素的位置,上例中設置為元素的value屬性。
那么該如何理解整句話的意義, 翻譯: 靜態文本TextBlock的Text屬性將通過綁定的方式關聯到元素名'slider'的value屬性上。
效果圖所示:
可以看到,在滑塊不斷的滑動過程中, TextBlock也在不斷的發生變化, 說明TextBlock已經得到了滑動滑動過程中的值變化, 這種關聯, 我們稱之為綁定, 在WPF當中, 綁定又分很多種, 而上面這種則是通過元素綁定的方式。
理解了基礎的綁定之后,然后就是理解綁定的模式。
綁定的模式就類似我們商業中的合作, 是一次性回報還是持續獲益, 是否可以單方面終止, 是否具有投票權等, 在WPF中綁定的模式又分為五種:
- OneWay(單向綁定) : 當源屬性發生變化更新目標屬性, 類似上面的例子中, 滑動變化更新文本的數據。示例:
效果:
- TwoWay(雙向綁定) : 當源屬性發生變化更新目標屬性, 目標屬性發生變化也更新源屬性。
與單向綁定的區別可以理解為, 前者只能打你,被打者不能還手, 雙向綁定的意思則是: 你敢打我一巴掌,我也能回你一巴掌。示例:
效果:
- OneTime(單次模式) : 根據第一次源屬性設置目標屬性, 在此之后所有改變都無效。
如第一次綁定了數據源為0, 那么無論后面如何改變 2、3、4... 都無法更新到目標屬性上。示例:
效果:
- OneWayToSource : 和OneWay類型, 只不過整個過程倒置。示例:
效果:
- Default : 既可以是雙向,也可以是單項, 除非明確表明某種模式, 否則采用該默認綁定
綁定到非元素上
上面的代碼中,使用的綁定方式是根據元素的方式: ElementName=xxx, 如需綁定到一個非元素的對象, 則有一下幾屬性:
- Source : 指向一個數據源, 示例, TextBox使用綁定的方式用Source指向一個靜態資源ABC:
- RelativeSource : 使用一個名為RelativeSource的對象來根據不同的模式查找源對象,
示例, 使用RelativeSource的FindAncestor模式, 查找父元素為StackPanel的Width值
- DataContext: 從當前的元素樹向上查找到第一個非空的DataContext屬性為源對象。
示例, 該示例用后臺代碼創建一個只包含Name的類, Test, 通過綁定窗口的DataContext上下文:
后臺代碼綁定簡單文本與列表
創建一個PageModel類, 定一個ClassName為班級名稱, 和一個Students學生列表, 后臺代碼:
窗口代碼
效果預覽
關于以上, 基本介紹了WPF元素綁定的方式與幾種模式, 接下講的是, WPF中的事件如果通過綁定的方式和UI分離。盡管WPF中仍然可以兼容winform中的事件模型, 而binding也是MVVM架構中的重要組成部分(下節會介紹)。
原文鏈接:https://www.cnblogs.com/zh7791/p/11379942.html
相關推薦
- 2022-06-15 go語言context包功能及操作使用詳解_Golang
- 2022-07-13 CMD使用技巧和常用固定語句
- 2023-03-27 python中end="?"的含義及說明_python
- 2023-04-03 React中使用Mobx的方法_React
- 2023-03-22 C語言中不定參數?...?的語法以及函數封裝_C 語言
- 2022-02-09 深入了解C++異常處理_C 語言
- 2022-09-29 Kotlin協程啟動createCoroutine及創建startCoroutine原理_Andro
- 2022-05-06 Linq中ToList()和CopyToDataTable()用法詳解_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支