2012-01-02 79 views
0

我試圖將過濾器添加到.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's。我已經設置了一個ListView來顯示消息(通過CollectionViewSource排序)。

現在我想添加兩個組合框到我的用戶界面以允許過濾這個ListView。當然,它們不應該包含重複項,所以我只想要不同的ClassA.Names和ClassB.Descriptions的全部消息當前顯示在ListView中。另外我想要一個ComboBox的過濾器也適用於另一個。

ListView的過濾已經完成並正在工作,但我無法弄清楚如何填充ComboBoxes。

回答

0

這應該工作,這裏的消息是你的過濾信息採集:

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(); 
+0

這個工作,非常感謝你。比我想象的更清潔,更富有彈性:) 但是,我無法弄清楚如何訪問我過濾的代表消息的CollectionViewSource。你能給我一個提示嗎? – Velines 2012-01-03 18:46:20

+0

使用CVS.View.OfType解決它。再次感謝您的信息。 – Velines 2012-01-03 20:42:42

0

如果我正確理解你想基於對A類和Bstring值的成員集合的性質來過濾List<Messages>集合。

如果是這樣,這樣的事情應該工作你:

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

請注意,這裏我把運營商在查詢和StartsWith字符串函數。您可以使用更適合您需求的功能和操作員對它們進行替換。

編輯:

好點的是讓他們也區分大小寫,在這種情況下使用,例如,

StartsWith("DescriptionToSearch",StringComparison.InvariantCultureIgnoreCase))

+0

這看起來不錯。有沒有辦法做到這一點與ObservableCollection持有消息? – Velines 2012-01-03 18:45:45

+0

使用CVS.View.OfType解決它。再次感謝您的信息。 – Velines 2012-01-03 20:41:33