INotifiyPropertyChanged接口和DependencyObject两种方式实现的可绑定属性的区别
以下仅为个人总结,如有错误,还请指正
- DependencyObject实现的依赖属性,写法上相对复杂一些,每个属性都要自己写Set和Get方法;INotifyPropertyChanged只需要在基类中实现一个属性修改的方法,就可以在子类中多个属性使用
- Dep的属性只有创建该对象的线程可以访问,而实现了INotifyPropertyChanged的接口的类的属性,不要求主线程也可以修改
- 在使用效果上,暂时未发现两者的差别
- 在程序卡的时候——例如出现较多的异常导致程序卡顿的时候,INotifyPropertyChanged接口的属性,如果是后台线程操作实现的属性,可能导致界面无法刷新;如果使用主线程也还是可以刷新。
- 如果单个属性,用DependencyObject实现,如果是一个类有多个属性,则用INotify。。。实现。
- 前者(INotify)是通知,后者是依赖属性,概念上也不一样
- 好像,Dep方式,对于集合无效?
- 根据StackOverFlow的说法,区别还有几个:点我访问StackOverFlow上的讨论贴
- 继承依赖属性类的类不被标记为可序列化——DependencyObjects are not marked as serializable
- 依赖属性类重写并Seal了该类的子类的GetHashCode和Equals方法
- 有线程要求,依赖属性类的依赖属性只能由创建线程访问。
- DP要求创建DP的线程和创建使用DP、绑定到DP的控件的线程一样。——延伸问题,后台线程可以创建UI控件吗——可以,然后这个后台线程就拥有了UI控件(及其所有子控件)一个控件由哪个线程创建,那么这个控件就属于哪个线程,这个控件的所有操作都智能由这个线程执行
- DP通常仅用于UI,不用于业务层。
- DP依赖WPF库(要引用WindowBase.dll),而INotifyPropertyChanged仅仅需要引用系统库(System.dll)——基本上C#程序都要引用
- DP性能更好:点我访问微软的解释
- ViewModel通常用INotify: A DependencyProperty is never required for a ViewModel