众所周知,WPF依赖属性强大的一批,一般依赖属性注册PropertyChangedCallBack的回调事件即可在此依赖属性绑定的属性被更改时触发此回调,常规写法如下:
public int Id
{
get { return (int)GetValue(IdProperty); }
set { SetValue(IdProperty, value); }
}
public static readonly DependencyProperty IdProperty = DependencyProperty.Register("Id", typeof(int), typeof(SCSimpleMap), new PropertyMetadata(0, OnIdChanged));
private static void OnIdChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
}
如上代码所示,使用时绑定此依赖属性的值发生变化就会进OnIdChanged方法。
常规属性这样写是没问题的,那么问题来了,当我们定义了一个集合,如果依然沿用此写法,只会在给集合赋值时会进入回调,而对集合的其他操作,比如Add、Remove、Clear这些都不会触发回调,这就很难搞哦,怎么办呢
为此我翻阅StackOverflow、踏遍微软源码,终于找到了解决办法。
首先,定义集合类依赖属性时,我们选择ObservableCollection这个类,为什么选用这个类,因为此类继承了INotifyCollectionChanged,这正是我们接收通知的关键。
接下来在此依赖属性回调中注册CollectionChanged事件
定义代码如下:
public ObservableCollection<int> IdCollection
{
get { return (ObservableCollection<int>)GetValue(IdCollectionProperty); }
set { SetValue(IdCollectionProperty, value); }
}
public static readonly DependencyProperty IdCollectionProperty = DependencyProperty.Register("IdCollection", typeof(ObservableCollection<int>), typeof(SCSimpleMap), new PropertyMetadata(new ObservableCollection<int>(), OnIdCollectionChanged));
private static void OnIdCollectionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if(e.NewValue is ObservableCollection<int> newIdCollection)
{
newIdCollection.CollectionChanged += IdCollection_CollectionChanged;
}
//DoSomething
}
private static void IdCollection_CollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
//DoSomething
}
此时集合的Add、Remove、Clear之类方法将会触发IdCollection_CollectionChanged回调