【问题标题】:MVVM not binding after initial value has been entered输入初始值后 MVVM 未绑定
【发布时间】:2023-03-27 01:13:01
【问题描述】:

我的 WPF (MVVM) 项目遇到了一个奇怪的问题。

我有一些控件绑定到 ViewModel 中的属性。 INotifyPropertyChanged 已配置,一切正常(最初有效)。我在控件中输入一些值,然后单击一个按钮。我可以看到,通过单步执行代码,所有属性值都是应有的值。到目前为止,它是教科书。

现在我注意到了这个问题。单击按钮后,会执行一些逻辑,例如将这些值保存到数据库中。然后我可以编辑控制值,然后再次保存到数据库中。此时属性不会更新。

绑定显然有效,因为输出显示没有绑定错误,当我单击“保存”按钮时,属性是正确的。但是,在我单击保存按钮,然后更改属性值后,属性没有更新。我无法理解为什么会这样。

作为试用,我将 PropertyChanged 添加到更新源触发器中,这似乎解决了问题,但是,我以前从未这样做过。有什么想法可能是错的吗?

我不相信答案是双向绑定(我很高兴错了),因为它绑定了!

<TextBox  Text="{Binding DataSource, UpdateSourceTrigger=PropertyChanged}" Grid.Row ="1" Grid.Column="2" />

我通常会使用的地方

<TextBox  Text="{Binding DataSource}" Grid.Row ="1" Grid.Column="2" />

【问题讨论】:

  • 没有UpdateSourceTrigger,只有在TextBox失去焦点后才会提交值。这会影响您的用例吗?另外,如果Text是从数据库中加载的,你应该使用TwoWay绑定模式。
  • 你能告诉我们在什么样的变化之后,价值更新失败了吗?
  • @helb,对不起,我没有提到,我已经尝试过 TwoWay 的黑客攻击 - 它没有任何区别。此外,它只是一种方式绑定(从我的 View 到我的 ViewModel)

标签: wpf mvvm


【解决方案1】:

UpdateSourceTrigger 属性确定必须更新绑定的时间。此属性的默认值为 LostFocus。因此,默认情况下,在您键入内容并将焦点移出后,绑定将更新。如果将属性值设置为 PropertyChanged,则在文本框中输入值后,绑定将立即更新。

http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger(v=vs.110).aspx

在您的情况下,绑定在按钮单击时更新,因为焦点从文本框转移到按钮。一旦 UpdateSourceTrigger 设置为 PropertyChanged,绑定将在每次文本更改时更新。

【讨论】:

  • 我迷路了,有 Default、Explicity、LostFocus 和 PropertyChanged 的​​选项吗?如果默认值为 LostFocus,那么默认值是什么?我也知道 UpdateSourceTrigger 是如何工作的,因此在我的示例中使用这两种方法,我的问题是为什么需要它。当我单击按钮时,确定这意味着 TextBox 失去了焦点吗?
  • @Dave “默认”取决于 DependencyProperty,类似于绑定模式。请参阅 UpdateSourceTrigger.Default 的文档:“绑定目标属性的默认 UpdateSourceTrigger 值。大多数依赖项属性的默认值为 PropertyChanged,而 Text 属性的默认值为 LostFocus。”
  • @helb,谢谢你,但是,当我点击一个按钮时,TextBlock 的 LostProperty 肯定是在按钮的“点击”之前执行的吗?
  • @Dave 不要假设 WPF 中触发的事件的顺序。这已经让我哭了好几次了……
  • 今晚我在电脑旁——我真的需要做一些测试。非常有趣的评论,非常非常有趣的评论!谢谢@helb
猜你喜欢
  • 1970-01-01
  • 2018-04-17
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 2012-05-04
  • 2016-02-22
相关资源
最近更新 更多