2019 4 12 WPF 繫結的預設模式

2022-01-13 13:01:52 字數 3629 閱讀 2066

title

author

date

createtime

categories

wpf 繫結的預設模式

lindexi

2019-04-12 09:38:58 +0800

2019-04-12 09:37:55 +0800

wpf小夥伴繫結了乙個屬性,但是發現屬性在更新的時候沒有同步到後台,他說在 wpf 繫結的預設值是什麼?為什麼沒有設定 mode 的屬性,有的是雙向有的是單向?本文就來告訴大家在 wpf 定義的依賴屬性是如何控制繫結的是雙向還是單向的方法

在依賴屬性或附加屬性,都可以在定義的時候傳入 frameworkpropertymetadata 請看**

public

static

readonly

dependencyproperty

twowayproperty

=dependencyproperty.register("twoway"

, typeof(string), typeof(mainwindow), new

frameworkpropertymetadata("

"));

上面**的使用和預設不相同,修改 propertymetadata 為 frameworkpropertymetadata 雖然傳入的預設值引數都是一樣的,但是 frameworkpropertymetadata 可以傳入更多的引數,如可以傳入 frameworkpropertymetadataoptions 變數

在 frameworkpropertymetadataoptions 變數可以通過設定 bindstwowaybydefault 指定這個值預設的繫結是雙向的

雖然從 binding 的 mode 的列舉的定義是

public

enum

bindingmode

預設的列舉值 0 是 twoway 但是在 mode 屬性通過特性設定了預設的值是 default 而如果設定預設的值是 default 就會讀取繫結的屬性的對應的 frameworkpropertymetadata 是否有設定預設是雙向

[defaultvalue(bindingmode.default)]

在 textblock 這些控制項,有很多屬性的繫結都是雙向的,但是如果是小夥伴定義的控制項,他可以定義出缺省是雙向繫結的或沒有的

public

string

twoway

set

}public

static

readonly

dependencyproperty

twowayproperty

=dependencyproperty.register("twoway"

, typeof(string), typeof(mainwindow), new

frameworkpropertymetadata("

", frameworkpropertymetadataoptions.bindstwowaybydefault));

public

string

oneway

set

}public

static

readonly

dependencyproperty

onewayproperty

=dependencyproperty.register("oneway"

, typeof(string), typeof(mainwindow), new

frameworkpropertymetadata("

", frameworkpropertymetadataoptions.affectsarrange));

嘗試再定義兩個屬性,繫結依賴屬性

public

string

property1

}public

string

property2

}private

string

_property;

private

string

_property2;

public

event

propertychangedeventhandler

propertychanged;

private

void

onpropertychanged([callermembername]string

name="

")

在建構函式繫結屬性

public

mainwindow()

;bindingoperations.setbinding(this, twowayproperty, binding);

binding

=new

binding

;bindingoperations.setbinding(this, onewayproperty, binding);

}

在介面繫結一下屬性就知道屬性是否修改

<

stackpanel

verticalalignment

="center"

horizontalalignment

="center"

>

<

textblock

margin

="10,10,10,10"

text=""

><

/textblock

>

<

textblock

text=""

margin

="10,10,10,10"

><

/textblock

>

<

textblock

x:name

="text"

margin

="10,10,10,10"

><

/textblock

>

<

button

content

="修改值"

click

="button_click"

><

/button

>

<

/stackpanel

>

介面的按鈕點選的時候修改屬性

private

void

button_click(object

sender, routedeventargs

e)

執行**點選按鈕,可以發現只有 property1 會修改

所有**在 github

建議只有在熟悉的屬性才可以不寫 mode 防止翻車

explain binding mode in wpf

bindingmode enum (system.windows.data)

.net - what are the defaults for binding.mode=default for wpf controls? - stack overflow

WPF的資料繫結(三)

這次我們來學習新的繫結知識,xml資料繫結。xmldataprovider 用來繫結 xml 資料,該xml資料可以是嵌入.xmal檔案的 xmldataprovider 標記中,也可以是外部位置引用的檔案中。當然嵌入式 xml 內容必須置於 xmldataprovider 內部的 標記中,而且不容...

WPF中ListBox的繫結

wpf中列表式控制項派生自itemscontrol類,繼承了itemssource屬性。itemssource屬性可以接收乙個ienumerable介面派生類的例項作為自己的值 所有可被迭代遍歷的集合都實現了這個介面,如陣列 list等 每乙個 itemscontrol的派生類都有自己的條目容器,如...

WPF中的DataTemplate繫結使用的場合

wpf讓程式設計師欣喜的是支援資料驅動,原來的winform和mfc是屬於事件驅動,資料驅動的好處是,無需在ui上發生變化,才被通知到去怎麼做,而是發現資料發生了變化,我就可以去處理了,資料可以讓兩個元素同時擁有,這樣就不用找觸發的控制項去處理事件,只需要知道資料發生變化了我就可以去做這件事了。da...