天天看點

[Silverlight]使用PagedCollectionView配合複選框實作動态篩選的解決方案

實際項目中我們往往有這樣的需求

<a href="http://www.024hi.com/Images/cnblogs/SilverlightPagedCollectionView_14D6E/image.png"></a>

即通過複選框動态的篩選DataGird的相關項,比如上面截圖所示例的篩選Gender列特定項。有的朋友可能已經想到了:直接操作ObservableCollection不就行了嗎?其實這樣做存在兩個問題:

PagedCollectionView本來就提供了篩選功能,操作ObservableCollection是不是顯得有點蠢了?

操作ObservableCollection後(篩選的時候一般是移除項),集合本身也發生了變化,而PagedCollectionView提供的篩選隻是在UI中反映變化而不會改變集合項

既然有如上兩個問題,那麼我們還是老老實實的使用PagedCollectionView的Filter屬性實作篩選吧

不過依然是存在問題的,這個暫且不說,先看一下正常情況下我們要實作以上需求需要做的工作

首先要在XAML中添加四個複選框

将三個CheckBox一個StackPanel中除了布局需要外,還可以友善我們周遊出所有的CheckBox以便過濾操作。

接下來,我們需要在CheckBox_Click的cs代碼中做如下工作

如果隻有一個CheckBox(比如:男),我們可以簡單的這樣

可現在我們有N個CheckBox,鑒于PagedCollectionView的Filter又是一個Predicate&lt;object&gt;,是以我們隻能這樣(這裡我們假設隻有兩個CheckBox的情況,因為實在是太麻煩了)

可見要是再多幾個複選框,這些判斷就要搞死人了。解決這個問題的關鍵就是動态建構Predicate,是以這裡我們編寫一個PredicateBuilder通過拼接表達式來輔助我們動态建構Predicate

代碼比較簡單,就不多解釋了。注意最後的ConvertToPredicate&lt;T&gt;這個擴充方法用來将建構好的Expression編譯後的Func&lt;T,bool&gt;轉換為Predicate&lt;T&gt;。

有了這個類的輔助後,我們的CheckBox_Click事件可就既省事又優雅多了

<a href="http://11011.net/software/vspaste"></a>

到此為止問題解決,希望能對搞Sl企業級開發的兄弟們有所幫助

Okay,have fun~

本文轉自紫色永恒51CTO部落格,原文連結:http://www.cnblogs.com/024hi/archive/2009/12/12/1622795.html ,如需轉載請自行聯系原作者

繼續閱讀