質問

したがって、WPF は CompositeCollections のビューに対する標準の並べ替えまたはフィルター動作をサポートしていません。この問題を解決するためのベスト プラクティスは何でしょうか。

異なるタイプのオブジェクト コレクションが 2 つ以上あります。それらを、並べ替えおよびフィルター可能な単一のコレクションに結合したいと考えています (並べ替えまたはフィルターを手動で実装する必要があります)。

私が検討したアプローチの 1 つは、コレクションを並べ替える必要のあるプロパティを含むいくつかのコア プロパティと各タイプのオブジェクト インスタンスのみを含む新しいオブジェクト コレクションを作成することです。

class MyCompositeObject
{
    enum           ObjectType;
    DateTime       CreatedDate;
    string         SomeAttribute;
    myObjectType1  Obj1;
    myObjectType2  Obj2;
{
class MyCompositeObjects : List<MyCompositeObject> { }

次に、2 つのオブジェクト コレクションをループして、新しい複合コレクションを構築します。明らかに、これは少し強引な方法ですが、うまくいきます。新しい複合オブジェクト コレクションでデフォルトのビューの並べ替えとフィルター動作をすべて取得し、データ テンプレートをそれに配置して、その複合アイテムに実際に格納されている型に応じてリスト アイテムを適切に表示できるようになります。

これをよりエレガントな方法で行うにはどのような提案がありますか?

役に立ちましたか?

解決 3

アップデート:はるかにエレガントな解決策を見つけました。

class MyCompositeObject
{
    DateTime    CreatedDate;
    string      SomeAttribute;
    Object      Obj1;
{
class MyCompositeObjects : List<MyCompositeObject> { }

リフレクションにより、Obj1 に格納されている特定の型が実行時に解決され、型固有の DataTemplate が期待どおりに適用されることがわかりました。

他のヒント

私はまだ WPF にあまり詳しくありませんが、これは並べ替えとフィルターに関する質問だと思います。 List<T> コレクション。

(ソートまたはフィルターを手動で実装する必要があります)

独自の並べ替え関数またはフィルター関数の実装を再検討してみませんか?私の経験では使いやすいです。以下の例では匿名デリゲートを使用していますが、独自のメソッドまたはクラスを簡単に定義して、複雑な並べ替えやフィルターを実装することもできます。このようなクラスには、並べ替えとフィルターを動的に構成および変更するためのプロパティを含めることもできます。

使用 List<T>.Sort(Comparison<T> comparison) カスタム比較関数を使用して:

// Sort according to the value of SomeAttribute
List<MyCompositeObject> myList = ...;
myList.Sort(delegate(MyCompositeObject a, MyCompositeObject b) 
{
    // return -1 if a < b
    // return 0 if a == b
    // return 1 if a > b
    return a.SomeAttribute.CompareTo(b.SomeAttribute);
};

リストから項目のサブコレクションを取得するための同様のアプローチ。

使用 List<T>.FindAll(Predicate<T> match) カスタムフィルター関数を使用して:

// Select all objects where myObjectType1 and myObjectType2 are not null
myList.FindAll(delegate(MyCompositeObject a)
{
    // return true to include 'a' in the sub-collection
    return (a.myObjectType1 != null) && (a.myObjectType2 != null);
}

あなたが言及した「ブルートフォース」方法は、実際には理想的な解決策です。すべてのオブジェクトは RAM 内にあり、I/O ボトルネックがないため、最新のコンピューターであれば、数百万のオブジェクトを 1 秒以内に並べ替えたりフィルター処理したりできます。

コレクションを操作する最もエレガントな方法は、.NET 3.5 の System.Linq 名前空間です。

ありがとう - 私はLINQをオブジェクトにも考えましたが、私の懸念は、タイプされたデータテンプレートの柔軟性の喪失です。これについては、リストにオブジェクトを表示する必要があります。

現時点で、ユーザーがオブジェクトのコレクションをどのように並べ替えたりフィルターしたりするかを予測できない場合は、次の点を検討する必要があります。 System.Linq.Expressions 実行時にオンデマンドでラムダ式を構築するための名前空間 (最初にユーザーに式を構築させ、次にコンパイル、実行し、最後にリフレクション名前空間を使用して結果を列挙します)。これについて理解するのはさらに難しいですが、非常に貴重な機能であり、おそらく (私にとっては間違いなく) LINQ 自体よりも画期的な機能です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top