2016-06-23 11 views
1

(.Netバージョン4.0を使用)DataGridsのWPF AttachedPropertyを作成しようとしています。このプロパティでは、グリッド内の項目をあるインデックスから別のインデックスに移動する方法を使用します(ItemSource)。これは、グリッドのソースコレクションが私の目的にとって安全なObservableCollectionであることを前提としています。私の計画はItemSourceObservableCollectionにキャストし、コレクションのMoveメソッドを使用します。不明な型のObservableCollectionをキャストして操作する方法

... ObservableCollectionは汎用性があり、基本クラス/インターフェイスがないため、にキャストするにはどうすればよいですか? typeパラメータはこのメソッドとは無関係ですが、DataGridでも動作するように設計されているため、このパラメータは不明です。私はとInsertを使ってIlistに行くことができますが、これは避けようとしているINotifyCollectionChangedイベントを不必要に発生させる可能性があります。

+0

反射を使用して、どのタイプがそれであるか把握することができます – user853710

答えて

2

ObservableCollection<T>.Move()にはタイプTのパラメータがないため、弾丸に噛み付いてリフレクションによってMove()を呼び出すことができます。私はそれをkludgeと呼び、スタックオーバーフローには不適切な言葉を使うかもしれませんが、以下のコンパイル、動作、そして何も気にしません。Tです。

ObservableCollection<int> foo = new ObservableCollection<int>() 
{ 
    0, 1, 2, 3, 4 
}; 

var method = foo.GetType() 
       .GetMethod("Move", 
        System.Reflection.BindingFlags.Instance 
         | System.Reflection.BindingFlags.Public); 

// Not a bad idea to check here if method is null before calling it. 

method.Invoke(foo, new object[] { 0, 2 }); 

あなたは、あなたが異なるパラメータでMove()をオーバーロードあなたの手のサブクラスを持っているまれなケースを防ぐことができますので、代わりにType.GetMethods()を呼び出し、LINQとの結果によってかき回ししたい場合があります。

しかし、GetMethod()Invoke()の呼び出しは、まったく同じ種類のObservableCollectionではありません。そして、あなたが探している単一のCollectionChangedイベントが手に入ります。

+0

ありがとう、それはうまくいきます。私はこの例ではあまりにもひどい反射を考慮しません。インターフェイスバインディングの多くはとにかくそれを使用するためです。私の方法は、とにかく頑丈ではありません。私はタイプ「T」を理解するためにリフレクションを使用する必要があることが恐れられていたので、これは簡単です。 – Tekito

+0

@テキットそれは本当です、バインディングはすべて反映に関するものです。しかし、それは通常誰もそれについて考える必要がない背中に隠されています! –

関連する問題