WPF入門教程系列十六 WPF中的資料繫結 二

2022-02-09 08:09:20 字數 4782 閱讀 1053

通過上一文章中的示例,學習了簡單的繫結方式。在這裡的示例,要學習一下繫結的模式,和模式的使用效果。

首先,我們來做乙個簡單示例,這個示例是根據listbox中的選中項,去改變textblock的背景色。將 textblock 的背景色繫結到在 listbox 中選擇的顏色。在下面的**中針對textblock的 background 屬性使用繫結語法繫結從 listbox 中選擇的值。**如下。

<

stackpanel

grid.row

="1"

>

<

textblock

width

="248"

height

="24"

text

="顏色:"

="wrap"

/>

<

listbox

x:name

="listcolor"

width

="248"

height

="56"

>

<

listboxitem

content

="blue"

/>

<

listboxitem

content

="red"

/>

<

listboxitem

content

="green"

/>

<

listboxitem

content

="gray"

/>

<

listboxitem

content

="cyan"

/>

<

listboxitem

content

="greenyellow"

/>

<

listboxitem

content

="orange"

/>

listbox

>

<

textblock

width

="248"

height

="24"

text

="改變背景色:"

/>

<

textblock

width

="248"

height

="24"

background=""

>

textblock

>

stackpanel

>

如果使用者在 listbox 中選擇了一種顏色,那麼textblock 的背景色會變為選定的顏色(如下圖1)。

圖1接下來我們對上面的示例進行一些修改:

1)  同乙個資料來源繫結到兩個或多個控制項上。如我們的示例中把listbox的選中項繫結到textbox與textblock。

2)  在繫結語法中增加乙個 mode 屬性,即繫結模式。對於我們的示例,我們把textblock的繫結語法中的mode屬性設為 oneway 。把textbox的繫結語法中的mode屬性設為twoway。

對於示例中的mode進行一下簡單說明(具體可以參見前一篇):

1)使用 oneway 繫結時,每當資料來源(listbox)發生變化時,資料就會從資料來源流向目標(textblock)。

2)onetime 繫結也會將資料從源傳送到目標;但是,僅當啟動了應用程式或 datacontext 發生更改時才會如此操作,因此,它不會偵聽源中的更改通知。

3)onewaytosource 繫結會將資料從目標傳送到源。

4)twoway 繫結會將源資料傳送到目標,但如果目標屬性的值發生變化,則會將它們發回給源。

下面就是修改後的示例**,功能是將 textblock (oneway) 和 textbox (twoway) 繫結到 listbox 的**:

<

stackpanel

grid.row

="1"

>

<

textblock

width

="248"

height

="24"

text

="顏色:"

="wrap"

/>

<

listbox

x:name

="listcolor"

width

="248"

height

="56"

>

<

listboxitem

content

="blue"

/>

<

listboxitem

content

="red"

/>

<

listboxitem

content

="green"

/>

<

listboxitem

content

="gray"

/>

<

listboxitem

content

="cyan"

/>

<

listboxitem

content

="greenyellow"

/>

<

listboxitem

content

="orange"

/>

listbox

>

<

textblock

width

="248"

height

="24"

text

="改變背景色:"

圖 2在上述示例中,對textblock使用了 oneway 繫結模式,因為我希望只有當選擇了 listbox 中的某一項之後,應用程式將選定的 listboxitem(資料來源)傳送到 textblock。我不希望 textblock 的變更會影響到 listbox中的內容。

我對textbox使用 twoway 繫結模式,因為我希望使用者在 listbox 中選擇一種顏色後,該顏色就會顯示在 textbox 中,並且其背景色也會隨之相應變化。如果該使用者在 textbox 中鍵入了一種顏色(例如pink),listbox 中剛才選中的顏色名稱就會被更新(即從目標到資料來源),當滑鼠再次點選這條修改後的資料時,新值就會被再次傳送到textbox上。這意味著 textblock 也會隨之改變。(請參見圖 2)。

如果我將 twoway 模式改回到 oneway,使用者則可以編輯 textbox 中的顏色,但是不會將textbox中輸入的值去替換listbox中選中項的值。

繫結模式如何應用呢?下面是個人的一點見解:

1)當只想讓使用者看到資料,而不希望使用者去修改資料時,可以採用 oneway 模式,類似winform中的唯讀屬性。

2)當希望使用者可以對控制項中的資料進行修改,同時讓使用者修改的資料更新到資料來源(dataset、物件、xml 或其他繫結控制項)中時,可以使用 twoway 繫結。

3)如果想讓使用者修改資料來源中的資料,而又不想使用towway模式,就可以使用 onewaytosource 繫結。onewaytosource模式允許通過在原來被看作是繫結源的物件中放置繫結表示式,從而翻轉源和目標。

4)當你的介面中的一系列唯讀控制項均被繫結了資料,並且當使用者重新整理了資料來源時,希望繫結控制項中的值仍保持不變,可以使用 onetime 繫結。此外,當源沒有實現 inotifypropertychanged 時,onetime 繫結模式也是乙個不錯的選擇。

說明:繫結目標中的修改何時去修改資料來源

在上面的例子中,textbox 使用了 twoway 繫結模式,所以當textbox 失去焦點時wpf會使用textbox中的值改變listbox中的值。如果你不想在textbox失去焦點時,就去修改listbox中的值,可以為 updatesourcetrigger 指定值,它是用於定義何時更新源的繫結屬性。可以為 updatesourcetrigger 設定三個值:explicit、lostfocus 和 propertychanged。

如果將 updatesourcetrigger 設定為 explicit,則不會更新源,除非從**中呼叫 bindingexpression.updatesource 方法。設定為lostfocus ,(textbox 控制項的預設值)指示資料來源繫結的控制項失去焦點時才會更新。propertychanged 值繫結控制項的繫結屬性每次發生更改時就去更新資料來源中的值。

WPF入門教程系列(4)

mvvmlight安裝之後,我們可以看到簡易的框架布局,生成了乙個viewmodel資料夾,viewmodel層的內容都放在這邊,除了main物件的viewmodel之外,還包含乙個viewmodellocator檔案,用來注入當前的viewmodel全域性例項。一 先來說說分層結構 如圖 1 vi...

WPF入門教程系列(5)

很簡單,僅僅是包含乙個實體物件,這邊注意的的是那他繼承了乙個父類 observableobject,這個父類的作用就是保證能夠檢測屬性是否被改變。其實在繼承的過程中,可能會遇到乙個問題 observableobject無法被繼承,解決方案是加乙個using galasoft.mvvmlight 命名...

WPF入門教程系列一

一 前言 公司專案基於wpf開發,最近專案上線有點空閒時間寫一篇基於wpf的基礎教材,wpf也是近期才接觸,學習wpf也是在網上查資料與微軟的msdn進行學習,寫本部落格的目為了溫故而知新把學習過程記錄下來,以備後查。學習wpf的基礎知識 1 wpf是微軟提供的一種用來開發 桌面應用 的技術 框架 ...