C# WPF数据绑定魔术

C# WPF数据绑定魔术,c#,wpf,data-binding,C#,Wpf,Data Binding,我有一个绑定到ItemsControl的ObservableCollection(基本上显示一个列表) Foo主要是这样的(还有其他成员,但它没有实现任何接口或事件): 当用户单击某个项目时,我会打开一个对话框,用户可以在其中编辑Foo的属性(绑定到一个小的viewmodel,其中包含所选项目的Foo属性),Xaml如下所示: <TextBox Text="{Binding Foo.Name,Mode=TwoWay}" Grid.Column="1" Grid.Row="0" Ma

我有一个绑定到ItemsControl的ObservableCollection(基本上显示一个列表)

Foo主要是这样的(还有其他成员,但它没有实现任何接口或事件):

当用户单击某个项目时,我会打开一个对话框,用户可以在其中编辑Foo的属性(绑定到一个小的viewmodel,其中包含所选项目的Foo属性),Xaml如下所示:

<TextBox Text="{Binding Foo.Name,Mode=TwoWay}"
    Grid.Column="1" Grid.Row="0" Margin="2" />

真正奇怪的是,当用户编辑名称时,列表中的值会改变(不是在键入时,而是在焦点离开字段后)

它是怎么做到的?我还没有在Foo对象上实现INotifyPropertyChanged接口

到目前为止,我检查了一下,它不仅刷新了整个列表,而且只刷新了选定的项目。但我不知道在哪里可以设置断点来检查谁在打电话


更新:感谢casperOne提供的解决方案链接!我将在这里添加一个摘要,以防出现404:

[…]实际上,您遇到了WPF的另一个隐藏方面,即WPF的数据绑定引擎将数据绑定到PropertyDescriptor实例,如果源对象是普通CLR对象且未实现INotifyPropertyChanged接口,则该实例将封装源属性。数据绑定引擎将尝试通过PropertyDescriptor.AddValueChanged()方法订阅属性更改事件。当目标数据绑定元素更改属性值时,数据绑定引擎将调用PropertyDescriptor.SetValue()方法将更改的值传输回源属性,并同时引发ValueChanged事件以通知其他订阅者(在本例中,其他订阅者将是列表框中的文本块


如果您正在实现INotifyPropertyChanged,那么您完全有责任在需要数据绑定到UI的每个属性设置器中实现更改通知。否则,更改将不会像您预期的那样同步。

它使用反射来设置该属性的值。INotifyPropertyChanged仅为needed是否需要通知文本框Foo类的Name属性发生了更改。

这完全是猜测,但我认为,由于您启用了双向绑定,WPF现在知道它何时进行更改,并将更新它知道绑定到同一实例的其他项


因此,因为您已经通过文本框更改了Name属性的值,并且WPF知道您何时更改了该值,所以它会尽最大努力更新它知道绑定到它的任何其他内容。

,因为它们是数据绑定到同一个对象的。如果您将绑定更改为

{Binding Foo.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}

然后,当用户在文本框中键入时,它们将同步。

是的,但是列表如何知道没有INotifyPropertyChanged的更改?这是一个有趣的想法!你知道我如何确认吗?@chris:如果我知道,我不会说“这完全是猜测”。如果我发现了,我会发回。@chris:在MSDN论坛上查看这个帖子,有人在MS:
{Binding Foo.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}