-2

에 미리 정의 된 종속성 속성 ItemsSource의 PropertyChangedCallback을 재정의하는 방법을 방법 보다 우선 WPF ItemsControl에서 종속성 속성 ItemsSource 미리 정의의PropertyChangedCallback.WPF ItemsControl에

ItemsControl에서 상속 된 WPF Custom Control을 개발했습니다. 거기에 미리 정의 된 종속성 속성 ItemsSource을 사용했습니다. 그게 내 데이터를 모니터링하고 확인해야만 Collection가 업데이트됩니다.

Google에서 많은 검색을했지만 내 요구 사항을 충족시키는 관련 솔루션을 찾을 수 없습니다.

https://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemssource(v=vs.110).aspx

이 친절하게 도와주세요, 는 메소드 이름은 무시 뭐죠? 파생 ItemsSource 클래스의 정적 생성자에서 ...

+0

[ItemsControl.OnItemsSourceChanged] (https://msdn.microsoft.com/en-us/library/system. windows.controls.itemscontrol.onitemssourcechanged.aspx). 이것은 'ItemsSource' 의존성 컨트롤의 속성 변경 콜백에서 호출됩니다. 이것은 당신이 찾고있는 것일 필요는 없습니다 ... – poke

+1

@poke'Collection'을 모니터하는 방법을 안내해 주시겠습니까? –

+0

Items 속성 https://msdn.microsoft.에서 더 많은 변화를 관찰 할 수 있습니다. com/en-us/library/system.windows.controls.itemscontrol.items (v = vs.110) .aspx CollectionView를 구현하므로 CollectionChanged 이벤트를 갖습니다. 그래도 잘 될지 모르겠다. ItemsSource가 설정되면 Items 컬렉션은 읽기 전용입니다. – Arie

답변

2

전화 OverrideMetadata :

public class MyItemsControl : ItemsControl 
{ 
    static MyItemsControl() 
    { 
     ItemsSourceProperty.OverrideMetadata(
      typeof(MyItemsControl), 
      new FrameworkPropertyMetadata(OnItemsSourcePropertyChanged)); 
    } 

    private static void OnItemsSourcePropertyChanged(
     DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     ((MyItemsControl)obj).OnItemsSourcePropertyChanged(e); 
    } 

    private void OnItemsSourcePropertyChanged(DependencyPropertyChangedEventArgs e) 
    { 
     var oldCollectionChanged = e.OldValue as INotifyCollectionChanged; 
     var newCollectionChanged = e.NewValue as INotifyCollectionChanged; 

     if (oldCollectionChanged != null) 
     { 
      oldCollectionChanged.CollectionChanged -= OnItemsSourceCollectionChanged; 
     } 

     if (newCollectionChanged != null) 
     { 
      newCollectionChanged.CollectionChanged += OnItemsSourceCollectionChanged; 
      // in addition to adding a CollectionChanged handler 
      // any already existing collection elements should be processed here 
     } 
    } 

    private void OnItemsSourceCollectionChanged(
     object sender, NotifyCollectionChangedEventArgs e) 
    { 
     // handle collection changes here 
    } 
}