为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在不实现INotifyPropertyChanged的情况下进行绑定更新?

为什么在不实现INotifyPropertyChanged的情况下进行绑定更新?

慕田峪7331174 2019-10-11 10:01:30
我创建了一个ViewModel并将其属性绑定到UI上的两个文本框。当我更改first的值并将焦点移到文本框之外时,另一个文本框的值也会更改,但是我没有实现INotifyPropertyChanged。这如何运作?以下是XAML<Window x:Class="WpfApplication1.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        xmlns:local="clr-namespace:WpfApplication1"        Title="MainWindow" Height="350" Width="525">    <Window.DataContext>        <local:ViewModel />    </Window.DataContext>    <StackPanel>        <TextBox Text="{Binding Name}" />        <TextBox Text="{Binding Name}" />    </StackPanel></Window>以下是我的ViewModelclass ViewModel{    public string Name { get; set; }}
查看完整描述

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和内存。


查看完整回答
反对 回复 2019-10-11
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

我可以解释为什么焦点更改时会更新属性:所有Bindings都有一个UpdateSourceTrigger属性,指示何时将更新源属性。此属性的默认值在上定义,DependencyProperty并且TextBox.Text属性设置为LostFocus,这意味着当控件失去焦点时将更新属性。


我相信UrbanEsc的答案可以解释为什么会更新值


查看完整回答
反对 回复 2019-10-11
  • 3 回答
  • 0 关注
  • 811 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信