2011-09-23 55 views
2

我試圖過濾顯示在DataGrid一個ObservableCollection篩選集合多次。 這在第一次效果很好,但是當我嘗試再次過濾時,它使用sourcecollection而不是過濾結果。 短的代碼示例:使用ICollectionView

ICollectionView view = CollectionViewSource.GetDefaultView(myCollection); 
view.Filter = delegate(object item){ 
    User user = item as User; 
    if(user != null && user.Name.ToLower().Contains(textbox.Text.ToLower())) return true; 
    return false; 
}; 

所以我想要做的是過濾器只有在我的DataGrid中顯示的項目,而不是整個收集(當然第一次使用了過濾器,它會使用整個收藏)。

回答

0

real您應該修復的問題是CollectionView Filter的性能,而不是通過將新過濾列表作爲源集合反饋到下一個過濾器來實現嵌套過濾器。

,你「想」,會導致一些問題,當用戶執行打字多次嘗試和刪除角色,因爲你將無法確定其源集合適用於過濾文本的嵌套過濾器/反饋源收集方法。

例如我們有100名員工,我們通過輸入「員工姓名」作爲「A」進行過濾......這列出了名稱以「A」開頭的50名員工。現在我們繼續輸入「H」......從名稱以「AH」開頭的50名僱員中篩選10名僱員。但現在我們刪除「H」,理想情況下,它應該使用100名員工搜索新的員工列表,但它會使用10名員工,因爲這反饋到嵌套的過濾過程。

想象它會多麼複雜獲得,如果有人經常類型,並移除過濾文本隨機字符!

所以基本規則是您必須將整個源集合中篩選

一旦我們知道這一點,現在我們可以嘗試以提高過濾器的功能...

  1. 使用LINQ和設置DataGrid的ItemsSource對每個輸入字符的結果。它們適用於大型集合(我有一個這樣的數據網格有30萬行,我使用LINQ執行快速過濾)。

  2. LINQ可以在後臺線程運行,並重新申請結果的DataGrid的ItemsSource。

  3. 如果在.NET 4.0,LINQ提供進行AsParallel()調用。非常有效。使用有限數量的池化線程進行過濾。

  4. LINQ還爲基於字符串屬性名稱的搜索提供AsQueryable()接口。

0

別的東西(可能是DataGrid)可在您看來,要重新設置過濾網,因爲你使用的是共享的默認視圖。使用您自己的集合視圖來代替:

ICollectionView view = new ListCollectionView(myList); 
0

您可以創建,檢查的是你已經設置的集合過濾器的輔助方法,如果它已經被設置然後保存您的篩選列表視圖中,並再次將其過濾並將該視圖設置爲DataGrid的數據源。

ICollectionView view = CollectionViewSource.GetDefaultView(myCollection); 

而且我認爲這部分代碼給你總是整個集合,而不是已經過濾的。

5

另一種選擇會是這樣的......

public void cmbYourComboBox_SelectionChanged(object sender, RoutedEventArgs e) 
{ 
    ICollectionView filteredView = CollectionViewSource.GetDefaultView(collection); 

    filteredView.Filter = new Predicate<object>(GetFilteredView); 

    dgYourDataGrid.ItemsSource = filteredView; 
} 

public bool GetFilteredView(object sourceObject) 
{ 
    if (HasConditionOne(sourceObject) && HasConditionTwo(sourceObject) 
    { 
     return true; 
    } 
    return false; 
} 

public bool HasConditionOne(object sourceObject) 
{ 
    //perform your test and evaluate the outcome 
} 

public bool HasConditionTwo(object sourceObject) 
{ 
    //perform your test and evaluate the outcome 
} 

如果源對象滿足所有需要的條件,將被視爲適合擺放在過濾視圖。

相關問題