通常我們在使用DataGrid顯示資料的時候,大部份的情況下都會透過資料繫結(Data Binding)來完成,配合設計師設計出來美美的樣版,就能以比較有質感一點的方式見人(雖然說穿了還是一個DataGrid)。
不過有時候會遇到一個情況:當使用者操作資料,或進行查詢之後,發現繫結的對象已經被清空了,而DataGrid還是會很開心的以預設的樣版顯示一條空白列,對有的人來說,看了就是會覺得怪怪的。所以,這次就來跟大家分享一個可以在繫結的對象被清空的時候,還能顯示自訂內容的一個替代方法。
最近設計x程式社團的林星同學提到關於使用ObjectDataProvider來進行資料的繫結的方式,幫不上什麼大忙的我,只能寫些入門的小範例來看看能不能有所幫助,就透過這個小範例來讓有興趣的朋友們先對ObjectDataProvider有基本的認識吧!!
首先呢~請自行連結到MSDN上關於ObjectDataProvider的介紹看看先吧!!除此之外,MSDN上還有一個不錯的範例:How to: Bind to an Enumeration
如果有仔細看完MSDN的介紹,以及範例的內容,那應該對ObjectDataProvider有初步的了解了~
基本上,ObjectDataProvider的以下三個屬性是很值得拿來好好運用的喔!!
ObjectType:提供繫結資料的型別
MethodName:提供繫結資料的型別用來輸出資料的方法
MethodParameters:要傳給輸出資料的方法的參數
只要好好善用上面的三個屬性,就可以把之前很多得寫好幾行程式碼的東西,透過ObjectDataProvider,直接在Xaml裡面就做完喔!!暖身就到這邊告一段落啦!!
而今天要分享的範例呢,就如同文章標題所說的,要來透過C#在CodeBehind中改變ObjectDataProvider的資料來源!!讓我們先來看看實作出來的成品:
這個範例其實很簡單,我用C#先寫好兩個用來描述資料的簡單類別,分別為Member和Product,程式碼如下:
再來是兩個使用了上述兩個類別,可以透過呼叫裡面的方法,用來提供資料的類別:
有了這四個類別之後,其實就可以在Xaml中直接透過ObjectDataProvider來呼叫Members.GetFemales()、Members.GetMales()或是Products.GetWindowPhones()、Products.GetAndroidPhone()這四個方法來取得資料,並進行繫結啦!!
不過我們要玩的不只是這樣,要在執行期動態的抽換資料的來源,就得在設定完ObjectDataProvider各個屬性之後,呼叫ObjectDataProvider.Refresh()方法,來看看上面的範例是怎麼寫的吧!!
就這麼簡單,一點都不難吧!!而在使用ObjectDataProvider的時候,如果像上面的範例一樣,會有兩種不同的資料來源類別,而用來呈現資料的元件又不是DataGrid的話,就得配合相對應的DataTemplate,才能呈現不同類別的資料喔!!(當然也可以再把上面的範例改成透過MethodPrameters來做得更漂亮喔~不過這個就留給大家自己練習啦!!)
最後,一樣奉上專案原始碼,請自行服用: