WPF 自定义集合型依赖属性时如何接收更改通知

众所周知,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回调

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取WPF自定义控件的依赖属性的数据流程如下: 1. 定义依赖属性:在自定义控件的代码,定义一个依赖属性并注册该属性。例如: ``` public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.Register( "MyProperty", typeof(string), typeof(MyControl), new PropertyMetadata("Default Value")); public string MyProperty { get { return (string)GetValue(MyPropertyProperty); } set { SetValue(MyPropertyProperty, value); } } ``` 2. 绑定依赖属性:在XAML,将自定义控件的依赖属性绑定到其他控件或数据源。例如: ``` <local:MyControl MyProperty="{Binding MyData}" /> ``` 3. 获取依赖属性的值:当自定义控件被渲染WPF框架会自动调用依赖属性的get方法,从绑定的数据源获取属性的值。如果没有绑定任何数据源,则使用属性的默认值。例如: ``` string myPropertyValue = myControlInstance.MyProperty; ``` 4. 监听依赖属性的变化:如果需要在属性值发生变化执行一些自定义逻辑,可以在自定义控件注册属性值变化的回调函数。例如: ``` public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.Register( "MyProperty", typeof(string), typeof(MyControl), new PropertyMetadata("Default Value", OnMyPropertyChanged)); private static void OnMyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { // Execute custom logic when MyProperty value changes } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值