-2

Как OverridePropertyChangedCallback из предопределенного Dependency Property ItemsSource в WPF ItemsControl.Переопределение PropertyChangedCallback предопределенного ItemsSource Dependency Property в WPF ItemsControl

Я разработал пользовательский контроль WPF, унаследованный от ItemsControl. При этом я использовал предопределенное свойство зависимости ItemsSource. В этом случае мне необходимо отслеживать и проверять данные после обновления Collection.

Я много искал в Google, но я не могу найти какое-либо релевантное решение для выполнения моего требования.

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

Пожалуйста, помогите мне, , Что имя метода Override? ...

+0

[ItemsControl.OnItemsSourceChanged] (https://msdn.microsoft.com/en-us/library/system. windows.controls.itemscontrol.onitemssourcechanged.aspx). Это вызывается в свойстве измененного обратного вызова элемента управления «ItemsSource». Возможно, это не обязательно то, что вы ищете ... – poke

+1

@poke Не могли бы вы посоветовать мне, как отслеживать изменения 'Collection' Changed ... –

+0

, возможно, вам больше повезло с проверкой изменений в свойствах Items https://msdn.microsoft. com/en-us/library/system.windows.controls.itemscontrol.items (v = vs.110) .aspx Он реализует CollectionView и, таким образом, имеет событие CollectionChanged. Я не знаю, как хорошо это работает. Он говорит, что элемент Items только для чтения, когда ItemSource установлен. – Arie

ответ

2

Вызов OverrideMetadata в статическом конструкторе производного класса ItemsSource:

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 
    } 
} 
Смежные вопросы