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 請看**
publicstatic
readonly
dependencyproperty
twowayproperty
=dependencyproperty.register("twoway"
, typeof(string), typeof(mainwindow), new
frameworkpropertymetadata("
"));
上面**的使用和預設不相同,修改 propertymetadata 為 frameworkpropertymetadata 雖然傳入的預設值引數都是一樣的,但是 frameworkpropertymetadata 可以傳入更多的引數,如可以傳入 frameworkpropertymetadataoptions 變數
在 frameworkpropertymetadataoptions 變數可以通過設定 bindstwowaybydefault 指定這個值預設的繫結是雙向的
雖然從 binding 的 mode 的列舉的定義是
publicenum
bindingmode
預設的列舉值 0 是 twoway 但是在 mode 屬性通過特性設定了預設的值是 default 而如果設定預設的值是 default 就會讀取繫結的屬性的對應的 frameworkpropertymetadata 是否有設定預設是雙向
[defaultvalue(bindingmode.default)]
在 textblock 這些控制項,有很多屬性的繫結都是雙向的,但是如果是小夥伴定義的控制項,他可以定義出缺省是雙向繫結的或沒有的
publicstring
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));
嘗試再定義兩個屬性,繫結依賴屬性
publicstring
property1
}public
string
property2
}private
string
_property;
private
string
_property2;
public
event
propertychangedeventhandler
propertychanged;
private
void
onpropertychanged([callermembername]string
name="
")
在建構函式繫結屬性
publicmainwindow()
;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
>
介面的按鈕點選的時候修改屬性
privatevoid
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...