天天看點

【萬裡征程——Windows App開發】資料綁定——簡單示例、更改通知、資料轉換

相比于理論,我更傾向于從實踐中開始部落格,尤其是對于資料綁定。那麼,我們先來看看幾個簡單的例子。

1.資料綁定到textbox

我們依舊使用前面的鬧鐘類來開始。在下面的代碼中,我們有屬性、構造函數,還有一個tostring()方法的重載。之是以重載這個方法是因為我們想在最後綁定的時候,這三個屬性能夠在textbox上顯示得更加工整。

接下來再在xaml中添加textbox控件如下,因為textbox此時是用作顯示而非輸入,是以建議設定其的隻讀屬性。資料綁定的核心就是text屬性中的那麼一個binding關鍵字。

但是光這樣還不夠,我們還需要在背景代碼中将資料綁定到textbox1的datacontext(資料上下文)中。

相信大家并不為覺得這個很難,相反我在學資料綁定的時候一上來就是一大堆理論,以至于我對資料一詞有了陰影——是以我學資料結構非常痛苦。

【萬裡征程——Windows App開發】資料綁定——簡單示例、更改通知、資料轉換

2.資料綁定到combobox

才儲存一個鬧鐘沒太大意思,我們多來幾個。

但是……

【萬裡征程——Windows App開發】資料綁定——簡單示例、更改通知、資料轉換

很顯然我們用了observablecollection< t >類,它為資料綁定提供了一個集合,這是因為它實作了inotifypropertychanged和inotifycollectionchanged接口。顧名思義,當屬性改變時,它可以通知它所綁定的控件,并且如果你希望該空間能夠同步更新,則将用于綁定的對象也實作inotifypropertychanged接口。這個類好歸好,但相對于textbox而言算有些高端了,以至于它無法顯示出來。但是我們可以用combobox來代替它,我們的類并不需要修改,前面的usefulalarm執行個體化也都不用改,隻需要将textbox1改成combobox1即可。以下是新的combobox代碼。

在圖示中我們也容易發現textbox和combobox兩個控件的width屬性的應用差別。在textbox中,我們将資料綁定到text中;而在combobox中,我們則是将資料綁定到itemssource中,簡單的說就是combobox拿來所有的資料,再将它們分成小的細節發給它的子對象,這些子對象都在combobox的datatemplate(資料容器)中。

【萬裡征程——Windows App開發】資料綁定——簡單示例、更改通知、資料轉換

在這裡我們并沒有用到前面所重載的tostring()函數,因為我們已經分别将title、description、alarmtime綁定到相應的textbox控件了。那圖示中又為什麼這些資料都是一行一行的表示呢,這都是布局控件stackpanel的功勞,全靠它的orientation屬性。如果将這個屬性設定成horizontal呢,那标題、描述已經時間就是全排在一行了。

【萬裡征程——Windows App開發】資料綁定——簡單示例、更改通知、資料轉換

3.資料綁定到listbox

聽說listbox和combobox很類似哦,它們都是box……xbox呀。部落客我有點懶,那可不可以直接将combobox的名字改成listbox就直接運作呢,答案是可以哦!那麼差別到底在哪裡呢?看看這張圖就知道啦。

【萬裡征程——Windows App開發】資料綁定——簡單示例、更改通知、資料轉換

咦?怎麼隻有一條鬧鐘了?别驚慌……拖動右邊的滾動條就可以檢視到全部的鬧鐘咯。我真的隻把combobox改成listbox還有相應的name屬性(包括背景代碼中的名字哦),以下就是完整的代碼啦,我會騙你?

4.資料綁定到listview

看了前面的代碼相信我沒有騙你吧,童鞋們看到listbox有沒有想到listview呢?我要是想說還是和前面一樣隻用改名字等就可以用listview,你還是不信麼?

【萬裡征程——Windows App開發】資料綁定——簡單示例、更改通知、資料轉換

當然了,還是用右邊的滾動條來下拉以檢視所有的資料。不過listview君的最佳姿勢不是這樣哦,将height改為600才是呢。看下圖——這才是高大上的listview君嘛!

【萬裡征程——Windows App開發】資料綁定——簡單示例、更改通知、資料轉換

好了不玩了,gridview也是可以這樣弄得,不信你試試。

1.我們為什麼要用資料綁定

很顯然,我們不可能把所有的資料全部固定在特定的控件上。比如,遊戲的積分、設定的鬧鐘、天氣預報甚至的通訊類的消息,它們都并非是一成不變的。但是也并非所有的控件都需要綁定,比如你的app的名字、發送消息時所用的發送按鈕上面的文本等。

2.那資料和ui之間又有哪些關系呢

首先我們得明确,資料的顯示和其背景的管理是不一樣的。資料與ui綁定之後,我們的資料就可以在這兩者之間進行溝通,如果資料發生變化時,綁定到資料的ui則會自動将相應的屬性進行調整,不僅僅是前面用到的text屬性,還有fontsize、width、foreground、image屬性都可以。

3.資料綁定到底是綁定什麼

首先,我們得有綁定源,這些就是我們需要綁定的資料,沒有資料,即使你綁定了,它也顯示不出來。

其次,我們還需要綁定目标,也就是framework類的dependencyproperty屬性,說得白話文點就是将資料綁定到ui的相應屬性上。

最後,我們還需要一個binding對象,它就像是搬運工,沒有它,資料也是無法動彈的。它能夠幫助我們将資料從資料源移動到綁定目标,并且将綁定目标的相應消息通知給綁定源。它還有一些巧妙的工具,能夠将綁定源的資料加工成特定的格式。

4.綁定源有哪些

所有的公共語言運作時對象,我們前面用的alarm類就是這種對象,另外ui元素也是哦。

5.聽說有的搬運工隻能将資料源的資料一次性搬到綁定目标後就不再搬了,而有的搬運工則會在資料修改後再搬一次,甚至還有的能夠在綁定目标更改後再将資料搬回到資料源

onetime綁定:這個搬運工的工作就是第一種,它隻負責在建立時将源資料更新到綁定目标。

oneway綁定:這是系統預設的搬運工,它是第二種,負責在建立時以及源資料發生更改時更新綁定目标。

twoway綁定:這個搬運工則是第三種,它能夠在綁定源和綁定目标的一邊發生更改時同時更新綁定源和綁定目标。但它在一種時候卻會偷懶,那就是對于textbox.text每次點選之後,它就不會将這個text屬性的更改更新到綁定源。不過如果碰到boss,它也隻能繼續搬了。那就是将binding.updatesourcetrigger設定成propertychanged。而預設情況下,隻有textbox失去焦點時才會去更新。

以下分别是oneway和twoway的例子:

拖動滑動條,就可以看到在textbox中顯示它的值的變化了。如果希望它隻變化一次,那就将代碼中的oneway改成onetime即可。

【萬裡征程——Windows App開發】資料綁定——簡單示例、更改通知、資料轉換

如下圖所示,點選item 1後textbox則會顯示相應的item 1,将textbox中的item 1修改為item 5後再listbox中也自動修改成了item5。

【萬裡征程——Windows App開發】資料綁定——簡單示例、更改通知、資料轉換
【萬裡征程——Windows App開發】資料綁定——簡單示例、更改通知、資料轉換

簡單示例:foreground的資料綁定

前面已經說到了foreground也可以綁定,想不想試試呢。我們現在textbox中寫一個textbox,然後在背景代碼中添加一個綁定就可以了。這個和前面的比較簡單,這裡隻是用來引出後面的東東哦

1.silder綁定到textblock,不使用更改通知

首先定義一個簡單的類bindingslider,同時在xaml中作如下定義。

雖然這裡隻是用到了oneway傳遞,但還是需要使用twoway。因為在這裡oneway是指從bindingslider類的slidervalue屬性單向傳遞到slider控件的value屬性。但我們需要的則是slider控件的value屬性單向傳遞到bindingslider類的slidervalue屬性,是以才得使用twoway方式。

首先執行個體化bindingslider類,再在背景代碼中獎bindingslider對象綁定到slider1的資料上下文。最後通過click事件來将bindingslider對象的slidervalue屬性傳遞給textblock控件的text屬性。

這裡的效果就是,拖動slider但是textblock不會有變化,而需要button來不斷的更改textblock的text。如果想要textblock的text能夠根據slider實時的更改,這就需要”更改通知“了。

2.silder綁定到textblock,使用更改通知

既然要使用通知更改的技術,那就可以在xaml代碼中将button控件删除掉了,包括背景代碼中的click事件。

緊接着來修改bindingslider類,首先得使用inotifypropertychanged接口。這個接口有propertychanged事件,而這個事件則會告知綁定目标綁定源已經發生修改,這樣綁定目标也會實時的進行更改。在新的set中,我們将slidervalue值傳遞到notifypropertychanged中。

最後我們還需要将bindingslider對象綁定到textblock的資料上下文。

這樣一來就全部更改完成了,試試就會發現textblock的text會根據slider的拖動而實時修改了。

有時候預設的輸出方式不能滿足我們的需要,比如前面的oneway示例,可能我們需要的是在textbox中顯示“開始加載“、”加載一半了“、”很快就加載完了“以及”已經加載好“等,甚至還可以讓其能夠轉換成英文哦。

那麼首先建立一個類slidervalueconverter.cs,然後實作ivalueconverter接口。然後按自己的需要寫它的converter方法即可。

最後還需要在xaml中添加如下代碼哦,值轉換器converter所使用的靜态資源已經在

以下是slider的value取不同值時textblock的不同顯示。

【萬裡征程——Windows App開發】資料綁定——簡單示例、更改通知、資料轉換
【萬裡征程——Windows App開發】資料綁定——簡單示例、更改通知、資料轉換

終于一口氣把自我感覺最難的資料綁定部分給寫完了,但願寫的還算清晰,歡迎指正。

歡迎大家點選左上角的“關注”或右上角的“收藏”友善以後閱讀。

為使本文得到斧正和提問,轉載請注明出處:

http://blog.csdn.net/nomasp

繼續閱讀