最近尝试在INotifyPropertyChanged接口类中使用数组属性

起因是在前端有大量功能一样的控件需要绑定,而采用方法是每一个控件都新建了一个对应的属性

为了后台方便使用这些属性,这些属性的名字均以“固定词+_+编号”构成

 

虽然逻辑不会出现问题,但是重复代码过多,增加减少都需要修改属性代码

所以希望通过只建立一个数组属性,每一个控件只绑定其中一个元素

实现更便捷的复用

 

在进行相应的修改之后

最开始将isChecked双向绑定数组的元素,没有任何问题

通过前端通过点击改变isChecked属性值会进入数组的get访问器

后台通过属性名调用值进行比较、值传递等操作的时候进入数组的get访问器

后台直接改变控件IsChecked属性值也不会进入数组的set访问器,而是进入数组的get访问器(P:理解的逻辑是后台改变控件IsChecked的属性值,通过双向绑定,带来控件对应的数组元素值的改变,没有使用数组名赋值所以不经过set访问器。因为数组的改变,会通过接口通知绑定的控件从get访问值获取最新的数组元素值。实现到IsChecked属性值和绑定的数组元素值的同步。)

只要IsChecked属性值改变,自定义style会根据IsChecked显示我自己的需求

 

但在使用转换器的属性中并没有起作用

最开始以为是转换器的原因,经调试发现是后台赋值的时候没有不会进入数组的set访问器

原因是赋值的时候是对属性数组的元素进行,而经过分析,涉及到数组名的地址和数组元素的地址不一样,接口只是对数组名地址值的变化进行set

在逐一改变元素的值之后,通过中间变量重新赋值给属性数组赋值,便能够进入set访问器

进入set访问器,通过PropertyChangedEventHandler事件通知,会调用get访问器更新值

在绑定后,只要数组元素或者对应的属性值发生改变,都会使前端调用get访问器进行更新。而set访问器只有后台给属性名赋值时才会进入。如果只是给属性数组的元素赋值,改变的只是元素的地址,这时会触发数组的get访问器,但因为会将数组地址返回值返回给前端和控件的属性值,因此前端不会改变。

无论数组还是数组的元素变动,都会通知前端调用set访问器

如果get的值没有改变,前端对应的控件不会进入转化器。

 

附上相关的一些资料

  • INotifyPropertyChanged PropertyChangedEventArgs获取变更属性

https://blog.csdn.net/weixin_30502157/article/details/102450886

 

 

  •  NotifyPropertyChanged 接口用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通知

https://www.cnblogs.com/wlming/p/5574778.html

 

posted on 2022-02-08 15:29  rin_riceroll  阅读(55)  评论(0编辑  收藏  举报