在你使用wpf應用程式開發的時候,是否需要進行資料繫結到enum
資料呢?在這篇文章中,我將向你展示在wpf中處理enum
資料繫結的方法。
假設存在乙個這樣的enum
資料的定義,具體內容如下文**中所示:
}1.1 新增引用
在mainwindow.xaml
檔案中從mscorlib
中引入命名空間system
。
xmlns:sys="clr-namespace:system;assembly=mscorlib"
1.2 建立乙個objectdataprovider
資源
在此步驟中,你需要建立乙個objectdataprovider
的資源,並給它乙個鍵名x:key="datafromenum"
,這樣就可以使用datafromenum
在**中使用它。並且你需要給methodname
設定為enum
型別上存在的getvalues
,然後將objecttype
設定為enum
型別。接下來,你將需設定objectdataprovider.methodparameters
的enum
型別。最後,你新增的objectdataprovider
資源如下面**所示
1.3binding
資料處理
現在,你可以使用資料繫結了。例如,想將資料繫結到combobox
上面,那麼你需要設定itemsource
為乙個新的繫結,並將資料來源繫結到我們上面定義的名為datafromenum
的資源。
到現在為止,所有的已經處理完成,執行程式可以看到資料已經正確繫結到combobox
上面。
讓我們來看看當資料繫結enum
型別時,如何使用wpf特性來改進**的使用和可讀性。首先,想封裝enum
型別的繫結而不需要objectdataprovider
資源的邏輯處理,還希望不需要必須定義資源才能在xaml中使用繫結功能。理想情況下,應該像處理普通物件的繫結一樣,將所有內容都內聯處理。為此,需要利用定製markupextension
的幫助類。這個擴充套件將簡單的接受enum
型別,然後為控制項建立乙個可繫結enum
值的列表,這種實現其實很簡單。
2.1markupextension
幫助類
markupextension
幫助類定義如下:
set}
_enumtype = value;}}
}public enumbindingsourceextension()
public enumbindingsourceextension(type enumtype)
public override object providevalue(iserviceprovider serviceprovider)
var actualenumtype = nullable.getunderlyingtype(_enumtype) ?? _enumtype;
var enumvalues = enum.getvalues(actualenumtype);
if (actualenumtype == _enumtype)
var temparray = array.createinstance(actualenumtype, enumvalues.length + 1);
enumvalues.copyto(temparray, 1);
return temparray;}}
}2.2binding
資料處理
看一下執行結果:
現在我們可以不用使用objectdataprovider
資源進行enum
型別的繫結工作了。這兩種方法進行對比一下,詳細這個新方法會讓你耳目一新,像發現了新大陸一般。
而enum
型別的值一般使用在程式中,而為了讓使用者獲得更好的使用體驗,一般都會在列舉值前面新增上屬性:description描述。為了完成此工作,我們只需使用typeconverter
進行轉換。
public override object convertto(itypedescriptorcontext context, cultureinfo culture, object value, type destinationtype)
}return string.empty;
}return base.convertto(context, culture, value, destinationtype);}}
}然後對定義的列舉值新增上[description]
屬性
}程式執行結果:
可以看到,我們新增了[description]
屬性時,這兩種方法都可以將[description]
屬性的值繫結到指定控制項中。
一種學習效果較好的學習方式
每當高考過後,一些狀元會賣 筆記 而且不少人買。這些考生之所以為狀元,個人認為不外兩點 1 記筆記 記的過程是一種學習,記下是認為自己還不懂的及歸納 自己的想法 2 利用筆記反覆複習 理解需要乙個過程,遺忘曲線告訴我們,在你沒記住之前,很快就會忘的 可以說,記筆記和反覆複習是最基本的學習方法,不重視...
一種比較好的 處理viewHolder 的方式
在我們使用adapter 的時候,總是不斷的寫類似建立個viewholder 類,然後通過gettag 的方式去獲取,感覺這種寫法總有改進的地方,目前在專案中有個改進的方法,抽象出工具類來,public static extends view t requestview view convertvi...
JS中一種實現sleep函式的方案
困擾了我很久的問題,在此留個記錄 原生js setinterval和settimeout 近似遞迴的處理方法 因為js是單執行緒,所以計時器也是有順序的 問題描述 我想實現乙個網頁的左右滑動效果 不是切換 解決思路 給滑動寫乙個方法,執行一次移動一小點距離,n次後移動完整張,使用setinterva...