我有一个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绑定为扩展器的内容。
答案 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");
}