• 关于INotifyPropertyChanged接口和get,set访问器和绑定


    最近尝试在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

  • 相关阅读:
    Xamarin studio配置问题
    安装moogodb
    什么是作用域, 什么是闭包, 什么是原型链,什么是递归, 什么是函数函数声明,什么是函数表达式,继承,this 指向
    前端框架Vue、angular、React的优点和缺
    判断终端是IOS 或 是Android
    VS code终端错位
    安装Flutter
    web直传OSS设置 头部信息【坑】
    从零创建react项目
    webpack报错vue-template-compiler 版本不对
  • 原文地址:https://www.cnblogs.com/rinroll/p/15871438.html
Copyright © 2020-2023  润新知