2012-01-02 5 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があります。私はすでに(ListViewSourceでソートされた)メッセージを表示するためにListViewを設定しました。

このListViewのフィルタリングを許可するために、2つのComboBoxをUIに追加します。もちろん、これらは重複を含んではいけません。したがって、ClassA.NamesとClassB.Descriptionsの区別が必要なのはです。現在ListViewに表示されているメッセージです。また、1つのComboBoxのフィルタをもう1つのフィルタにも適用したいと考えています。

ListViewのフィルタリングは既に行われていますが、コンボボックスの作成方法はわかりません。

答えて

0

このメッセージは、あなたのフィルターメッセージ収集である場合には、動作するはずです:私は右のあなたがタイプAとタイプBのメンバーのコレクションのプロパティのstring値に基づいてList<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(); 
+0

を使用することによって、彼らはまた、大文字と小文字を区別しないようにすることです、どうもありがとうございました。私が今まで想像していたよりもはるかにクリーンでエレガントです:) しかし、メッセージを表すフィルタリングされたCollectionViewSourceにアクセスする方法を理解できません。あなたは私にヒントを与えることができますか? – Velines

+0

CVS.View.OfType を使用して解決しました。あなたのポストにもう一度感謝します。 – Velines

0

は、 。もしそうなら

、このようなものはあなたを動作するはずです:ここで私は、クエリとStartsWith文字列関数でAND演算子を入れ

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

注意を。あなたのニーズに適した関数と演算子でそれらを置き換えることができます。

EDIT:

良い点は、これは動作します。この場合、例えば、

StartsWith("DescriptionToSearch",StringComparison.InvariantCultureIgnoreCase))

+0

これはかなりいいね。メッセージを保持するObservableCollectionでこれを行う方法はありますか? – Velines

+0

CVS.View.OfType を使用して解決しました。あなたのポストにもう一度感謝します。 – Velines

関連する問題