2009-04-20 48 views
1

大多數WPF數據網格控件都具有內置的過濾所示數據的功能。我對使用該功能感興趣,但斷開與數據網格的使用。獨立的WPF過濾器控件

我希望找到一個用戶控件,它將返回一個我可以在LINQ查詢中使用的Expression<Func<T, bool>>。有誰知道這樣的用戶控制?

回答

5

在WPF中,內置控件的過濾使用CollectionView執行。然後將CollectionView指定爲收集控制的ItemsSource(從ItemsControl導出的任何東西)。

從.NET 3.5 SP1開始,CollectionView類的篩選器屬性採用類型爲Predicate<object>的代理。 Predicate<object>似乎與Func<object, bool>基本相同,但兩者並不直接兼容。您應該能夠輕鬆創建一個Func<object, bool>委託來包裝Predicate<object>委託。

public static Func<object, bool> GetFuncFromPred(Predicate<object> pred) 
{ 
    return (obj => pred.Invoke(obj)); 
} 

可以在CollectionView上的過濾器調用該方法,然後在LINQ查詢中使用它們。

例子:

List<object> list = GetList(); 
CollectionView colView = new CollectionView(list); 
ListBox lb = GetListBox(); 
lb.ItemsSource = colView; 
colView.Filter = GetFilter(); 
var filteredItems = list.Where(GetFuncFromPred(colView.Filter)); 
+0

嘿,謝謝,但我認爲你的答案有點偏離正軌。我正在尋找一個WPF控件來提供表達式。 – NoizWaves 2009-04-20 22:32:43

+0

您可能會發現某人構建的自定義內容,但是沒有內置WPF控件來執行此操作。抱歉。我正在解釋如果你願意,你可以自己做這件事。 – 2009-04-21 03:29:22

0

我不知道有什麼。我們必須建立自己的。

我們使用了CollectionViewSource並添加了一個默認過濾器以及用自定義過濾器替換默認過濾器的功能。

+0

無賴。我在想這可能是要走的路。您是否可以構建使用泛型和反射的控件,或者爲每個類創建硬編碼的過濾器? – NoizWaves 2009-04-20 22:35:38