實際項目中我們往往有這樣的需求
<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<object>,是以我們隻能這樣(這裡我們假設隻有兩個CheckBox的情況,因為實在是太麻煩了)
可見要是再多幾個複選框,這些判斷就要搞死人了。解決這個問題的關鍵就是動态建構Predicate,是以這裡我們編寫一個PredicateBuilder通過拼接表達式來輔助我們動态建構Predicate
代碼比較簡單,就不多解釋了。注意最後的ConvertToPredicate<T>這個擴充方法用來将建構好的Expression編譯後的Func<T,bool>轉換為Predicate<T>。
有了這個類的輔助後,我們的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 ,如需轉載請自行聯系原作者