2016-06-23 1 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라고 부르며, 다른 사람들은 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 사실, 바인딩은 모든 것을 반영합니다. 하지만 대개는 아무도 그것에 대해 생각할 필요가없는 뒤쪽에 숨어 있습니다! –

관련 문제