2016-06-23 39 views
1

(使用.Net版本4.0)我正在嘗試爲DataGrids創建一個WPF AttachedProperty。該物業將採用一種方法將網格的ItemSource中的物品從一個索引移動到另一個索引。它假定電網的源收集是一個ObservableCollection,這對我的目的是安全的。我的計劃是將ItemSource轉換爲ObservableCollection,然後使用該集合的Move方法。如何投射和操縱未知類型的ObservableCollection

但是... ObservableCollection是通用的並且沒有基類/接口,那麼我該如何將轉換爲?類型參數與此方法無關,但也未知,因爲此設計適用於任何DataGrid。我可以一路下降到Ilist,使用RemoveInsert,但這可能會不必要地提高INotifyCollectionChanged事件,我試圖避免。

+0

你可以使用反射來找出它是哪種類型 – user853710

回答

2

由於ObservableCollection<T>.Move()沒有T類型的任何參數,所以您可以咬緊牙關並通過反射呼叫Move()。我把它叫做kludge,其他人可能會使用不適合Stack Overflow的單詞,但以下編譯,工作原理並不關心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 }); 

你可能想打電話Type.GetMethods(),而不是通過與LINQ結果翻找,這樣你就可以防範,你有你的手一個子類,用不同的參數重載Move()極少數情況下。

但是GetMethod()Invoke()調用完全不關心它是什麼種類的ObservableCollection。你會得到你正在尋找的單一CollectionChanged事件。

+0

謝謝,這工作正常。在這種情況下,我不會認爲反射太糟糕了,因爲如此多的接口綁定反正使用它。無論如何,我的方法並不是非常強大。我擔心會不得不使用反射來找出'T'類型,所以我很放心,這很簡單。 – Tekito

+0

@Tekito這是真的,綁定是所有關於反射。但它通常隱藏在沒有人考慮的背後! –