如何替代预定义的依赖项属性的ItemsSource的PropertyChangedCallback在WPF ItemsControl的

问题描述:

如何覆盖PropertyChangedCallback在WPF ItemsControl预定义的依赖项属性ItemsSource如何替代预定义的依赖项属性的ItemsSource的PropertyChangedCallback在WPF ItemsControl的

我开发了一个WPF自定义控件,继承自ItemsControl。在此我使用了预定义的依赖属性ItemsSource。因为我需要一旦Collection得到更新来监视和检查数据。

我在谷歌搜索了很多,但我无法找到任何相关的解决方案来满足我的要求。

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

请帮助我,什么方法名重写? ...

+0

[ItemsControl.OnItemsSourceChanged(https://msdn.microsoft.com/en-us/library/system。 windows.controls.itemscontrol.onitemssourcechanged.aspx)。这在“ItemsSource”依赖项控件的属性更改回调中调用。这可能不一定是你正在寻找... – poke

+1

@poke你可以请指导我,如何监视'集合'改变... – 2016-09-19 06:14:06

+0

你可能有更多的运气观察项目属性的变化https://msdn.microsoft。 com/en-us/library/system.windows.controls.itemscontrol.items(v = vs.110).aspx它实现了CollectionView,因此有CollectionChanged事件。我不知道它会如何运作。它说ItemsSource被设置时,Items集合是只读的。 – Arie

呼叫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 
    } 
}