Проблема с фильтром ICollectionView wpf С#

Я пытаюсь отфильтровать ICollection, но фильтр не применяется, и вместо этого он дает мне все записи. есть ли проблема в предикате? поэтому есть два метода, в которых фильтр применяется к коллекции. Сначала он фильтрует записи для SW_Version, а затем во втором фильтре он фильтрует для соответствия идентификатору. в основном я реализую функцию поиска.

   public void Updateswlist()
    {
        CRmappings2 = new ObservableCollection<SPFetchCREntity>(crentities.ToList());
        AllCRSP = CollectionViewSource.GetDefaultView(CRmappings2);
        SearchMU = SelectedSW.SW_Version;
        AllCRSP.Filter = obj =>
        {
            SPFetchCREntity entity = obj as SPFetchCREntity;
            return obj != null && entity.SW_Version == SearchMU.ToString();
        };
        AllCRSP.Refresh();

2-й фильтр

        public void searchMUID()
    {
        AllCRSP.Filter = obj =>
        {
            SPFetchCREntity entity = obj as SPFetchCREntity;
            return obj != null && entity.MU_Identifier == Mupass.ToString();
        };
        AllCRSP.Refresh();
    }

person Sam King    schedule 05.10.2017    source источник
comment
Вы пытаетесь одновременно фильтровать по SW_Version и MU_Identifier?   -  person mm8    schedule 05.10.2017
comment
Установлен ли источник CVS CRmappings2?   -  person JWP    schedule 05.10.2017
comment
@ mm8 Нет, они происходят на разных экранах. но второй отфильтрованный применяется к виду первого фильтра.   -  person Sam King    schedule 05.10.2017


Ответы (3)


Второй фильтр перезаписывает первый. Если вы хотите иметь возможность фильтровать по обоим свойствам, вам необходимо включить оба условия в свой предикат:

public void searchMUID()
{
    string Mupass = "";
    AllCRSP.Filter = obj =>
    {
        SPFetchCREntity entity = obj as SPFetchCREntity;
        return obj != null && entity.SW_Version == SearchMU.ToString() && entity.MU_Identifier == Mupass.ToString();
    };
    AllCRSP.Refresh();
}
person mm8    schedule 05.10.2017
comment
Это работает, но я нашел проблему. Поскольку я добавляю фильтр в этот `public void Updateswlist()` и снова делаю фильтр для представления из public void searchMUID(), представление из производного первого фильтра исчезло, и поэтому я не могу выполнить поиск записи. предположим, если я очистил фильтр AllCRSP из второго метода, он также очистит все фильтры первого метода? - person Sam King; 05.10.2017

Я предпочитаю использовать ReactiveList из ReactiveUI и его производную коллекцию. Это просто работает - не нужно вручную запускать Refresh

public class TweetsListViewModel : ReactiveObject
{
    ReactiveList<Tweet> Tweets = new ReactiveList<Tweet>();

    IReactiveDerivedList<TweetTileViewModel> TweetTiles;
    IReactiveDerivedList<TweetTileViewModel> VisibleTiles;

    public TweetsListViewModel()
    {
        TweetTiles = Tweets.CreateDerivedCollection(
            x => new TweetTileViewModel() { Model = x },
            x => true,
            (x, y) => x.CreatedAt.CompareTo(y.CreatedAt));

        VisibleTiles = TweetTiles.CreateDerivedCollection(
            x => x,
            x => !x.IsHidden);
    }
}

Если SPFetchCREntity не реализует INotifyPropertyChanged, вы можете создать производную коллекцию с аргументом сброса, который можно наблюдать. Каждый раз, когда он тикает, весь список фильтруется

person Krzysztof Skowronek    schedule 05.10.2017

Вот как я решил проблему с двойным фильтром. я получил идею по этой ссылке https://code.msdn.microsoft.com/windowsdesktop/CollectionView-Tips-MVVM-d6ebb4a7

        public void searchMUID()
    {
        Muview = (CollectionView)new CollectionViewSource { Source = CRmappings2 }.View; //CRmappings2 is an observable collection and Muview is a public property of collectionview
        //FirstCRSP = AllCRSP;

        //muview.Filter = null;

        Muview.Filter = obj =>
        {
            SPFetchCREntity entity = obj as SPFetchCREntity;
            return obj != null && entity.SW_Version == SearchMU.ToString() && entity.MU_Identifier == Mupass.ToString();
        };
        Muview.Refresh();
    }
person Sam King    schedule 05.10.2017
comment
В чем разница между этим ответом и моим? - person mm8; 06.10.2017
comment
@ mm8 Я добавил эту дополнительную строку Muview = (CollectionView)new CollectionViewSource { Source = CRmappings2 }.View;, которая фильтрует наблюдаемую коллекцию вместо iколлекции, и таким образом я могу сохранить фильтр, примененный к iколлекции. - person Sam King; 06.10.2017
comment
new CollectionViewSource создает новый CollectionViewSource, который затем преобразуется в CollectionView и ничего больше. - person mm8; 06.10.2017
comment
И ответ на ваш фактический вопрос заключается в том, что вам придется включить оба условия в свой предикат. - person mm8; 06.10.2017
comment
@ мм8 как я могу добавить это в список AllCRSP = CollectionViewSource.GetDefaultView(CRmappings2); - person Sam King; 06.10.2017
comment
Вы не можете, потому что это не список. Но, пожалуйста, задайте новый вопрос, если у вас есть другая проблема. - person mm8; 06.10.2017