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

我创建了一个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>

以下是我的ViewModel


class ViewModel

{

    public string Name { get; set; }

}


慕田峪7331174
浏览 812回答 3
3回答

临摹微笑

我测试了,你是对的。现在我在网上搜索它,并找到了它。抱歉,花这么长时间回复,实际上您遇到了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和内存。

qq_花开花谢_0

我可以解释为什么焦点更改时会更新属性:所有Bindings都有一个UpdateSourceTrigger属性,指示何时将更新源属性。此属性的默认值在上定义,DependencyProperty并且TextBox.Text属性设置为LostFocus,这意味着当控件失去焦点时将更新属性。我相信UrbanEsc的答案可以解释为什么会更新值
打开App,查看更多内容
随时随地看视频慕课网APP