首先,我想说下面的示例过于简单化了.假设你绑定了WPF控件.
Window绑定到Person类,该类实现INotifyPropertyChanged
并在表单中具有Name setter
public string Name { get { return _name; } set { _name = "Some Name"; OnPropertyChanged("Name"); } }
即只要用户尝试从UI更改它,就会为其分配"某些名称".但这个样本不起作用.我将TextBox中的名称更改为某个值按Tab键,强制焦点移动到Button,TextBox中的值保持不变,尽管触发了PropertyChanged事件.
你能解释一下为什么会这样吗?据我所知,PropertyChanged
事件强制UI重新读取属性中的值并显示它们,但在我的示例中,数据绑定文本框中的值不会更新.
再次.我知道这是财产的不良实施,但我想重申,这是过于简单化.这只是一个样本.但无论如何,PropertyChanged表示属性已更改,应该更新,但事实并非如此.
TextBox忽略PropertyChanged事件,因为它是事件的发起者.
一些澄清:
TextBox(或文本框上的绑定)知道它是发起者,因为它在同一个调用中接收PropertyChanged事件.通过执行异步调用,文本框(或绑定)无法知道它是启动器,因此它将处理事件,就像其他人已更新它一样
如果您在UI中添加第二个文本框,则会在编辑第一个文本时看到第二个TextBox发生更改,反之亦然.