绑定到已过滤的可观察集合

时间:2020-07-30 15:08:22

标签: c# wpf

我有一个A类型的可观察的集合。

A包含一个枚举-IsWhite

我可观察的集合称为ACollection

我还有2个数据网格,其中一个itemssource绑定到ACollection,其中A项将IsWhite设置为false,另一个绑定到同一集合,但IsWhite设置为true。

我该如何实现?

该集合的声明如下;

ObservableCollection<A> ACollection = new ObservableCollection<A>;

和班级

public class A
{
    IsWhite isWhiteEnum { get; set; } = IsWhite.False;
}

我希望一个数据网格itemssource绑定到ACollection,填充其中IsWhiteFalse的项目,另一个数据网格itemssource绑定到{{1 }}弹出ACollectionIsWhite的项目。

1 个答案:

答案 0 :(得分:1)

这是本文相关部分的说明:

https://social.technet.microsoft.com/wiki/contents/articles/26673.wpf-collectionview-tips.aspx

您不想过滤集合的默认视图,因为那样您的过滤器将同时应用于两个数据网格。

这段代码获得两个独立的视图:

PeopleView = (CollectionView)new CollectionViewSource { Source = People }.View;
LevelsPeopleView = (CollectionView)new CollectionViewSource { Source = People }.View;

人是一个可观察的人的集合。

这两个视图都是集合视图,例如。

 public CollectionView LevelsPeopleView { get; set; }

视图绑定在TwoCollectionViews.xaml中,例如

    <DataGrid ....
              ItemsSource="{Binding PeopleView}"

本文还介绍了各种过滤器,例如msdn方法:

private void ShowOnlyBargainsFilter(object sender, FilterEventArgs e)
{
AuctionItem product = e.Item as AuctionItem;
if (product != null)
{
    // Filter out products with price 25 or above
    if (product.CurrentPrice < 25)
    {
        e.Accepted = true;
    }
    else
    {
        e.Accepted = false;
    }
}
}

或更复杂的方法。

您设置了一个过滤器:

            LevelsPeopleView.Filter = FirstOfLevel_Filter;

如果视图已经从该collectionview中获取了数据,则将不会发生任何事情。您还需要做

         LevelsPeopleView.Refresh();

这种过滤效率很低,而linq在大型数据集上效果更好。小型数据集更好。除非您的用户真的很喜欢滚动。