如何使用集合视图源在wpf中使用集合内的集合绑定时应用过滤器

时间:2015-11-28 00:11:30

标签: wpf filter listbox expander

我有一个ListBox,它有不同的扩展器作为ListBoxItem。 expandder的内容中包含ListBox。现在我想在标题和扩展器的内容中应用搜索过滤器。

例如: -

如果标题有a且内容有b,c,d,bt,如果我搜索b则会显示具有内部和内部内容的扩展器,它只显示b和bt。

以下是我的绑定结构。

private ObservableCollection<FontDetail> _fontDetail;
public ObservableCollection<FontDetail> FontDetailList
{
    get
    {
        return _fontDetail;
    }
}

    FontDetail
    {
        public FamilyChild fontChild { get; set; }
        //ContextMenu End

        public bool IsFamily { get; set; }
        public int TotalFonts { get; set; }
        public List<FamilyChild> FamilyChildList { get; set; }
    }

    public class FamilyChild
    {
        public FontStatus Status { get; set; }


        public long TimeToAdd { get; set; }
        public FontType FontType { get; set; }
        public string SampleText { get; set; }
        public string Name { get; set; }
        public string FontFamily { get; set; }
        public string FontStyle { get; set; }
        public long FontWeight { get; set; }
        public string FontId { get; set; }

        public string MenuItem1 { get; set; }
        public string MenuItem2 { get; set; }
        public string MenuItem3 { get; set; }

        public bool IsEnableMenuItem1 { get; set; }
        public bool IsEnableMenuItem2 { get; set; }
        public bool IsEnableMenuItem3 { get; set; }
    }

所以我用ListDetailList绑定了ListBox。现在我想在FontDetail和FamilyChildList上应用过滤器。 Expander标头中的FontDetail绑定和FamilyChildList绑定为扩展器的内容。

1 个答案:

答案 0 :(得分:0)

您必须两次应用过滤器。首先进行外部集合,然后在外部集合的Filter谓词中应用第二个Filter。以下代码过滤员工,其车辆名称以&#34; S&#34;开头,并显示员工姓名和车辆清单。

DataStore包含EmployeeList, 员工包含VehicleList

        private void BtnFilter_Click(object sender, RoutedEventArgs e)
        {
            var source = CollectionViewSource.GetDefaultView(Dgrd.ItemsSource);            
            source.Filter = new Predicate<object>(FilterEmployees);            

            source.Refresh();
        }

        private bool FilterEmployees(object o)
        {
            DB1.Employee e = o as DB1.Employee;

            var vehicles = CollectionViewSource.GetDefaultView(e.Vehicles);
            vehicles.Filter = new Predicate<object>(FilterVehicles);

            return (e.Vehicles.Where(v=>v.Name.StartsWith("S"))).Count() > 0;
        }

        private bool FilterVehicles(object obj)
        {
            DB1.Vehicle v = obj as DB1.Vehicle;
            return v.Name.StartsWith("S");
        }

Filtering output