2011-09-20 28 views
0

我正嘗試創建一個具有兩個選項卡的表單,每個選項卡都帶有一個DataGrid,並在其上具有不同的篩選器。我創建了過濾器這樣:XAML DataGrid篩選不會應用篩選器

ObservableCollection<ParcelVoucherDetails> _voucherDetails = new ObservableCollection<ParcelVoucherDetails>(); 

CollectionView cvFreightOut = new CollectionView(_voucherDetails); 
cvFreightOut.Filter += FreightOutFilter; 
dgFreightOut.ItemsSource = cvFreightOut; 

CollectionView cvFreightIn = new CollectionView(_voucherDetails); 
cvFreightIn.Filter += FreightInFilter; 
dgFreightIn.ItemsSource = cvFreightIn; 

我然後創建過濾器這樣:

 public bool FreightOutFilter(object o) 
    { 
     ParcelVoucherDetails p = o as ParcelVoucherDetails; 
     if (p != null) 
     { 
      return (p.Type == "Freight Out"); 
     } 
     return false; 
    } 

    public bool FreightInFilter(object o) 
    { 
     ParcelVoucherDetails p = o as ParcelVoucherDetails; 
     if (p != null) 
     { 
      return (p.Type == "Freight In"); 
     } 
     return false; 
    } 

現在,這裏就是它很煩人。在後面的事件中,當我將項目添加到ObservableCollection時,我可以看到過濾器正在觸發並接受或拒絕過濾器,但所有項目仍然出現在兩個DataGrid上。

我試過使用CollectionViewSource,並且也不起作用。我可以完成任何過濾工作的唯一方法是跳過ObservableCollection,並將DataTable用於DataViews。我想避免在這裏,因爲使用ObservableCollection的其他代碼的方便。

有沒有人看到這個實際工作,如果是這樣,如何?

回答

2

我終於在把我的頭撞在牆上後發現它。我現在感覺很荒謬,但我不得不分享解決方案:

ListCollectionView cvFO = new ListCollectionView(_voucherDetails); 
cvFO.Filter += FreightOutFilter; 
dgFreightOut.ItemsSource = cvFO; 

ListCollectionView cvFI = new ListCollectionView(_voucherDetails); 
cvFI.Filter += FreightInFilter; 
dgFreightIn.ItemsSource = cvFI; 

這將單獨設置過濾器。顯然,使用通用的CollectionView而不是ListCollectionView是一個禁忌。 :)