ICollectionView过滤器问题wpf c#

时间:2017-10-05 15:24:23

标签: c# wpf data-binding observablecollection icollectionview

我正在尝试过滤ICollection但过滤器没有得到应用,而是它给了我所有记录。谓词中有什么问题吗?所以有两种方法将过滤器应用于集合。首先,它过滤SW_Version的记录,然后在第二个过滤器中过滤匹配的id。基本上我正在实现搜索功能。

Connection

第二过滤器

public class Session
{
    public void OpenSession(Connection connection)
    {

    }
}

3 个答案:

答案 0 :(得分:1)

第二个过滤器会覆盖第一个过滤器。如果您希望能够按两个属性进行过滤,则需要在谓词中包含这两个条件:

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();
}

答案 1 :(得分:0)

我更喜欢使用ReactiveUI中的ReactiveList及其derived collection。它只是工作 - 不需要手动刷新

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,您可以使用reset参数创建dervied集合,这是可观察的。每次滴答时,都会过滤整个列表

答案 2 :(得分:0)

这就是我解决双重过滤问题的方法。我从这个链接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();
    }