从列表中的列表中填充组合框

时间:2012-01-02 22:22:34

标签: c# wpf

我正在尝试将过滤器添加到.NET 3.5 SP1中的自定义对象列表中。 我的对象看起来像这样:

public class Message {
  string Filename;
  DateTime Timestamp;
  List<ClassA> A;
  List<ClassB> B;
  // ...
}

public class ClassA {
  string Name;
  // ...
}

public class ClassB {
  string Description;
  // ...
}

我有一个ObservableCollection来保存我的所有消息;每条消息有2个或更多ClassA,0到n ClassB。我已经设置了一个ListView来显示消息(通过CollectionViewSource排序)。

现在我想在我的UI中添加两个ComboBox,以允许过滤此ListView。当然它们不应该包含重复项,所以我只想要当前显示在ListView中的所有消息的不同ClassA.Names和ClassB.Descriptions。此外,我希望一个ComboBox的过滤器也适用于另一个。

ListView的过滤已经完成并正常工作,但我无法弄清楚如何填充ComboBox。

2 个答案:

答案 0 :(得分:0)

这应该可行,其中Messages是过滤后的消息集合:

var distinctNames = 
    (from message in Messages
    from a in message.A
    select a.Name).Distinct();

var distinctDescriptions = 
    (from message in Messages
    from b in message.B
    select b.Description).Distinct();

答案 1 :(得分:0)

如果我理解你想要根据类型List<Messages>的成员集合属性的string值过滤A集合并输入B

如果是这样,这样的事情对你有用:

var msgs = messagies.Select(ms=>ms).Where(ms=>ms.A.Exists(cla=>cla.Name.StartsWith("NameToSearch") && 
        ms.B.Exists(clb=>clb.Description.StartsWith("DescriptionToSearch"))));

请注意,这里我将 AND 运算符放在查询和StartsWith字符串函数中。您可以使用更适合您需求的功能和操作符来替换它们。

编辑:

好的一点是,通过在这种情况下使用 ,使它们也不区分大小写,例如,

StartsWith("DescriptionToSearch",StringComparison.InvariantCultureIgnoreCase))