在WPF中一種較好的繫結Enums資料方法

2022-01-23 00:04:01 字數 2954 閱讀 1408

在你使用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.methodparametersenum型別。最後,你新增的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...