Binding是用來(lái)實(shí)現(xiàn)界面控件的屬性與后臺(tái)數(shù)據(jù)之間的綁定也祠,通過(guò)這種形式將前臺(tái)界面與后臺(tái)數(shù)據(jù)聯(lián)系在一起達(dá)到界面與數(shù)據(jù)耦合的目的恋脚。
WPF綁定引擎從 Binding 對(duì)象獲取有關(guān)以下內(nèi)容的信息: 源對(duì)象和目標(biāo)對(duì)象歼捏,數(shù)據(jù)流的方向处嫌,通過(guò)binding的模式來(lái)確定數(shù)據(jù)綁定的方向,一共有五種模式(Default偎球,OneTime洒扎,OneWay,OneWayToSource衰絮,TwoWay)逊笆,值轉(zhuǎn)換器通過(guò)將 Converter 屬性設(shè)置數(shù)據(jù)轉(zhuǎn)換成所指定的值,每個(gè)Binding對(duì)象都有一個(gè)ValidationRules屬性岂傲,可以被設(shè)置為一個(gè)或多個(gè)派生自ValidationRule的對(duì)象,每個(gè)規(guī)則都會(huì)檢查特定的條件并更具結(jié)果來(lái)標(biāo)記數(shù)據(jù)的有效性子檀。
總得來(lái)說(shuō)镊掖,可以分為一下幾種:?對(duì)象間的綁定·?綁定到集合·?數(shù)據(jù)模板乃戈,多值綁定。
直接綁定某個(gè)key
? ? ? ?在xaml中亩进,某些key被寫(xiě)成一個(gè)資源症虑,例如字符串,數(shù)值類(lèi)型归薛,那么其本身就是一個(gè)數(shù)據(jù)谍憔,這時(shí)候可以直接綁定key,那么此時(shí)這個(gè)path就可以直接寫(xiě)成一個(gè)點(diǎn)(.)主籍,另外此時(shí)這個(gè)path也可以省略不寫(xiě)习贫,直接綁定source。
數(shù)據(jù)源是控件的依賴屬性
? ? ? ? 這個(gè)是在項(xiàng)目上使用特別多的一種綁定源千元,依賴屬性不僅是可以是一個(gè)目標(biāo)也可以是一個(gè)數(shù)據(jù)源苫昌,直接綁定其他控件的依賴屬性,此時(shí)通過(guò)綁定控件的名字以及綁定的路徑和綁定模式幸海,一般是默認(rèn)祟身,默認(rèn)模式不是每個(gè)控件都是一樣的,這個(gè)模式就決定了數(shù)據(jù)的流向物独。
使用RelativeSource綁定
? ?當(dāng)我們控件不能夠通過(guò)名字找到源的時(shí)候可以通過(guò)RelativeSource去找到控件袜硫,通過(guò)相對(duì)的位置去找尋源,RelativeSource模式有三種,TemplatedParent偎蘸、Self和FindAncestor漱受。
第一種是通過(guò)自身:
通過(guò)TemplatedParent找尋父控件作為自身的源。
通過(guò)找尋祖先控件作為自己的源憨攒,可以指定是第幾層,AncestorLevel屬性指定的是以Binding目標(biāo)控件為起點(diǎn)的層級(jí)偏移量阀参。AncestorType屬性告訴Binding去找什么類(lèi)型的對(duì)象作為自己的源肝集,不是這個(gè)類(lèi)型的對(duì)象會(huì)被跳過(guò)。
使用Datacontext作為數(shù)據(jù)源
? ? ? ?WPF的UI布局是樹(shù)形結(jié)構(gòu)蛛壳,這個(gè)樹(shù)的每個(gè)節(jié)點(diǎn)都是控件杏瞻,都有DataContext屬性。這一點(diǎn)非常重要衙荐,因?yàn)楫?dāng)一個(gè)Binding只知道自己的Path而不知道自己的源的時(shí)候捞挥,它會(huì)沿著樹(shù)的一路向樹(shù)的根部找過(guò)去,每經(jīng)過(guò)一個(gè)節(jié)點(diǎn)都要查看這個(gè)節(jié)點(diǎn)的DataContext屬性是否具有Path所指定的屬性忧吟,在項(xiàng)目中如果一個(gè)對(duì)象的數(shù)據(jù)被頻繁的使用砌函,那么可以使用datacontext綁定是一個(gè)很常用的方法,當(dāng)一個(gè)綁定沒(méi)有顯式的源對(duì)象時(shí),WPF會(huì)遍歷邏輯樹(shù)找到一個(gè)非空的DataContext讹俊。
總結(jié):對(duì)于對(duì)象間的綁定垦沉,綁定源為ElementName,Path為綁定源屬性,以下的幾個(gè)屬性是來(lái)源之一仍劈。
使用集合作為源
? ? ? ? 在項(xiàng)目開(kāi)發(fā)中會(huì)經(jīng)常使用到集合列表的控件厕倍,WPF中的列表式控件都派生自ItemControl類(lèi),自然也繼承了ItemSource這個(gè)屬性贩疙。ItemSource可以接收一個(gè)IEnumerable接口派生類(lèi)的實(shí)例作為自己的值(所有可被迭代遍歷的集合都實(shí)現(xiàn)了這個(gè)接口讹弯,所以基本上C#集合都可以作為數(shù)據(jù)源)。
對(duì)于集合的綁定这溅,通常會(huì)需要用到以下幾個(gè)標(biāo)記:
使用ADO.NET對(duì)象作為Binding的源
使用ADO.NET的Dataset對(duì)象的DataTable作為數(shù)據(jù)源组民。
把ObjectDataProvider指定為Source:當(dāng)數(shù)據(jù)源的數(shù)據(jù)不是通過(guò)屬性,而是通過(guò)方法暴露給外界的時(shí)候芍躏,我們可以使用這種對(duì)象來(lái)包裝數(shù)據(jù)源再把它們指定為Source邪乍。
使用XmlDataProvider把XML數(shù)據(jù)指定為Source:一些WPF控件是級(jí)聯(lián)的(如Treeview和Menu),我們可以把樹(shù)狀結(jié)構(gòu)的XML數(shù)據(jù)作為源指定給與之關(guān)聯(lián)的Binding对竣。
把使用LINQ檢索到的數(shù)據(jù)作為數(shù)據(jù)源:使用LINQ的查詢結(jié)果指定為數(shù)據(jù)源庇楞。
多值綁定MultiBinding
當(dāng)有目標(biāo)需要多個(gè)數(shù)據(jù)源共同組合的結(jié)果時(shí),需要用到多重綁定否纬÷郎危可以通過(guò)轉(zhuǎn)換器將多個(gè)數(shù)據(jù)源值轉(zhuǎn)換成一個(gè)目標(biāo)值。