3 回答
TA贡献1982条经验 获得超2个赞
我测试了,你是对的。现在我在网上搜索它,并找到了它。
抱歉,花这么长时间回复,实际上您遇到了WPF的另一个隐藏方面,那就是WPF的数据绑定引擎将数据绑定到PropertyDescriptor实例,如果源对象是纯CLR对象并且未实现,则该实例将包装源属性INotifyPropertyChanged接口。数据绑定引擎将尝试通过PropertyDescriptor.AddValueChanged()方法订阅属性更改事件。当目标数据绑定元素更改属性值时,数据绑定引擎将调用PropertyDescriptor.SetValue()方法将更改后的值传输回源属性,并且它将同时引发ValueChanged事件以通知其他订阅者(在这种情况下,其他订阅者将是ListBox中的TextBlocks。
并且,如果您要实现INotifyPropertyChanged,则您有责任在每个属性的设置程序中实现更改通知,这些设置需要将数据绑定到UI。否则,更改将不会像您期望的那样同步。
希望这能使事情有所改善。
因此,基本上,您可以做到这一点,只要它是一个普通的CLR对象即可。非常简洁,但完全出乎意料-在过去的几年中,我做了一些WPF工作。您永不停止学习新事物,对吗?
请注意,这仅在使用binding时有效。如果从代码更新值,则更改不会被通知。[...]
绑定时,WPF使用轻得多的PropertyInfo类。如果显式实现INotifyPropertyChanged,则WPF所需要做的就是调用PropertyInfo.GetValue方法以获取最新值。与获取所有描述符相比,这要少得多的工作。描述符的最终开销约为属性信息类的内存的4倍。[...]
实现INotifyPropertyChanged可能是相当繁琐的开发工作。但是,您需要根据WPF应用程序的运行时占用空间(内存和CPU)权衡该工作。自己实施INPC将节省运行时的CPU和内存。
TA贡献1835条经验 获得超7个赞
我可以解释为什么焦点更改时会更新属性:所有Bindings都有一个UpdateSourceTrigger属性,指示何时将更新源属性。此属性的默认值在上定义,DependencyProperty并且TextBox.Text属性设置为LostFocus,这意味着当控件失去焦点时将更新属性。
我相信UrbanEsc的答案可以解释为什么会更新值
- 3 回答
- 0 关注
- 811 浏览
相关问题推荐
添加回答
举报