如何替代预定义的依赖项属性的ItemsSource的PropertyChangedCallback在WPF ItemsControl的
问题描述:
如何覆盖PropertyChangedCallback
在WPF ItemsControl
预定义的依赖项属性ItemsSource
的。如何替代预定义的依赖项属性的ItemsSource的PropertyChangedCallback在WPF ItemsControl的
我开发了一个WPF自定义控件,继承自ItemsControl
。在此我使用了预定义的依赖属性ItemsSource
。因为我需要一旦Collection
得到更新来监视和检查数据。
我在谷歌搜索了很多,但我无法找到任何相关的解决方案来满足我的要求。
请帮助我,什么方法名重写? ...
答
呼叫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
}
}
[ItemsControl.OnItemsSourceChanged(https://msdn.microsoft.com/en-us/library/system。 windows.controls.itemscontrol.onitemssourcechanged.aspx)。这在“ItemsSource”依赖项控件的属性更改回调中调用。这可能不一定是你正在寻找... – poke
@poke你可以请指导我,如何监视'集合'改变... – 2016-09-19 06:14:06
你可能有更多的运气观察项目属性的变化https://msdn.microsoft。 com/en-us/library/system.windows.controls.itemscontrol.items(v = vs.110).aspx它实现了CollectionView,因此有CollectionChanged事件。我不知道它会如何运作。它说ItemsSource被设置时,Items集合是只读的。 – Arie