XAML DataGrid не будет применять фильтр - PullRequest
0 голосов
/ 20 сентября 2011

Я пытаюсь создать форму с двумя вкладками, каждая с 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, я вижу, как фильтры запускают и принимают или отклоняют фильтр, как и ожидалось, но ВСЕ элементы по-прежнему появляются в обеих DataGrids.

Я пытался использовать CollectionViewSource, но это тоже не работает. Единственный способ заставить работать любую фильтрацию - пропустить ObservableCollection и использовать DataTable с DataViews. Я хотел бы избежать этого из-за удобства в остальной части кода для использования ObservableCollection.

Кто-нибудь видел, как это действительно работает, и если да, то как?

1 Ответ

2 голосов
/ 21 сентября 2011

Я наконец нашел его после того, как ударился головой о стену. Я чувствую себя сейчас нелепо, но мне пришлось поделиться решением:

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

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

Это устанавливает фильтры отдельно. По-видимому, использование универсального CollectionView вместо ListCollectionView является нет-нет. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...