網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
什么是綁定(Binding)?
在winform中, 我們常常會(huì)用到各種類(lèi)型的賦值, 例如:
- button1.Text="Hello";
- label.Text="Hello";
- ...
類(lèi)似這種賦值操作, 我們之所以不稱之為綁定, 主要原因是因?yàn)樗麄兇蠖鄶?shù)操作都是一次性的, 無(wú)論是數(shù)據(jù)還是按鈕本身發(fā)生變化,對(duì)兩者而言都是不可見(jiàn)的。
而綁定的概念則側(cè)重于: 兩者的關(guān)聯(lián),協(xié)議與兩者之間的影響。
首先, 從一個(gè)簡(jiǎn)單的例子來(lái)理解什么是綁定。
創(chuàng)建一個(gè)滑塊控件, 并且希望在滑動(dòng)的過(guò)程中, 把值更新到另外一個(gè)靜態(tài)文本上。代碼如下:
在winform中, 我們常規(guī)的做法會(huì)給滑塊創(chuàng)建一個(gè)值改變事件,同時(shí)將滑塊的值賦值給文本。
接下來(lái), 我只需要在靜態(tài)文本中添加一小段綁定的聲明,即可完整原本很復(fù)雜的操作:
Text={Binding ElementName=slider,Path=Value}
- {Binding }: Binding的聲明語(yǔ)法, 一對(duì)尖括號(hào),開(kāi)頭聲明以Binding 開(kāi)始。
- ElementName= : 該聲明意為, 設(shè)置元素的名稱
- Path: 設(shè)置關(guān)聯(lián)元素的位置,上例中設(shè)置為元素的value屬性。
那么該如何理解整句話的意義, 翻譯: 靜態(tài)文本TextBlock的Text屬性將通過(guò)綁定的方式關(guān)聯(lián)到元素名'slider'的value屬性上。
效果圖所示:
可以看到,在滑塊不斷的滑動(dòng)過(guò)程中, TextBlock也在不斷的發(fā)生變化, 說(shuō)明TextBlock已經(jīng)得到了滑動(dòng)滑動(dòng)過(guò)程中的值變化, 這種關(guān)聯(lián), 我們稱之為綁定, 在WPF當(dāng)中, 綁定又分很多種, 而上面這種則是通過(guò)元素綁定的方式。
理解了基礎(chǔ)的綁定之后,然后就是理解綁定的模式。
綁定的模式就類(lèi)似我們商業(yè)中的合作, 是一次性回報(bào)還是持續(xù)獲益, 是否可以單方面終止, 是否具有投票權(quán)等, 在WPF中綁定的模式又分為五種:
- OneWay(單向綁定) : 當(dāng)源屬性發(fā)生變化更新目標(biāo)屬性, 類(lèi)似上面的例子中, 滑動(dòng)變化更新文本的數(shù)據(jù)。示例:
效果:
- TwoWay(雙向綁定) : 當(dāng)源屬性發(fā)生變化更新目標(biāo)屬性, 目標(biāo)屬性發(fā)生變化也更新源屬性。
與單向綁定的區(qū)別可以理解為, 前者只能打你,被打者不能還手, 雙向綁定的意思則是: 你敢打我一巴掌,我也能回你一巴掌。示例:
效果:
- OneTime(單次模式) : 根據(jù)第一次源屬性設(shè)置目標(biāo)屬性, 在此之后所有改變都無(wú)效。
如第一次綁定了數(shù)據(jù)源為0, 那么無(wú)論后面如何改變 2、3、4... 都無(wú)法更新到目標(biāo)屬性上。示例:
效果:
- OneWayToSource : 和OneWay類(lèi)型, 只不過(guò)整個(gè)過(guò)程倒置。示例:
效果:
- Default : 既可以是雙向,也可以是單項(xiàng), 除非明確表明某種模式, 否則采用該默認(rèn)綁定
綁定到非元素上
上面的代碼中,使用的綁定方式是根據(jù)元素的方式: ElementName=xxx, 如需綁定到一個(gè)非元素的對(duì)象, 則有一下幾屬性:
- Source : 指向一個(gè)數(shù)據(jù)源, 示例, TextBox使用綁定的方式用Source指向一個(gè)靜態(tài)資源ABC:
- RelativeSource : 使用一個(gè)名為RelativeSource的對(duì)象來(lái)根據(jù)不同的模式查找源對(duì)象,
示例, 使用RelativeSource的FindAncestor模式, 查找父元素為StackPanel的Width值
- DataContext: 從當(dāng)前的元素樹(shù)向上查找到第一個(gè)非空的DataContext屬性為源對(duì)象。
示例, 該示例用后臺(tái)代碼創(chuàng)建一個(gè)只包含Name的類(lèi), Test, 通過(guò)綁定窗口的DataContext上下文:
后臺(tái)代碼綁定簡(jiǎn)單文本與列表
創(chuàng)建一個(gè)PageModel類(lèi), 定一個(gè)ClassName為班級(jí)名稱, 和一個(gè)Students學(xué)生列表, 后臺(tái)代碼:
窗口代碼
效果預(yù)覽
關(guān)于以上, 基本介紹了WPF元素綁定的方式與幾種模式, 接下講的是, WPF中的事件如果通過(guò)綁定的方式和UI分離。盡管WPF中仍然可以兼容winform中的事件模型, 而binding也是MVVM架構(gòu)中的重要組成部分(下節(jié)會(huì)介紹)。
原文鏈接:https://www.cnblogs.com/zh7791/p/11379942.html
相關(guān)推薦
- 2022-04-12 Python中BeautifulSoup模塊詳解_python
- 2022-11-09 Python有序容器的?sort?方法詳解_python
- 2022-04-17 You need tcl 8.5 or newer in order to run the Redi
- 2022-12-30 Golang通道channel的源碼分析_Golang
- 2022-09-22 Apriori算法的實(shí)現(xiàn)
- 2022-06-02 詳解Python?flask的前后端交互_python
- 2022-03-19 .NET6使WebApi獲取訪問(wèn)者IP地址_基礎(chǔ)應(yīng)用
- 2022-04-24 C語(yǔ)言的abs()函數(shù)和div()函數(shù)你了解嗎_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支