6

我有一个运行良好的 C# WPF MVVM 应用程序。

唯一的问题是当我修改文本框并单击菜单时。如果我在不单击另一个控件的情况下执行此操作,则永远不会触发 view->viewmodel 事件,因为文本框没有失去焦点。如果我错了,请纠正我,但我认为 RaisePropertyChanged 仅在 LostFocus (或 OnBlur 或任何类似事件)上触发。

因此,在编辑文本框后立即单击菜单保存按钮会导致视图模型使用旧值保存数据。

所以,恢复:

这个序列工作正常:

  1. 编辑文本框
  2. 单击另一个控件
  3. RaisePropertyChanged 被触发,视图模型被更新
  4. 点击菜单上的保存按钮
  5. 以正确值保存的数据

这个序列给了我一个错误:

  1. 编辑文本框
  2. 点击菜单上的保存按钮
  3. 以正确值保存的数据

如何解决这个问题?

4

2 回答 2

12

这是 WPF 和 WinForms 中文本框的常见问题。您可以通过指示绑定系统在每次对 TextBox 的更改而不是在失去焦点时更新 VM 来解决此问题。为此,请将UpdateSourceTrigger绑定的 设置为PropertyChangedPropertyChanged每当 TextBox为其Text属性引发事件时,这都会写回 VM 。

<TextBox Text="{Binding MyText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
于 2013-07-03T21:04:36.587 回答
8

对于TextBox.Text依赖属性,它的默认值UpdateSourceTriggerLostFocus(即,当控件失去焦点时,您的视图模型属性会更新)。要在输入文本时立即更新属性,请设置UpdateSourceTrigger=PropertyChanged. (有关更多信息,请参阅上面的链接——它实际上专门涵盖了您的示例。)

于 2013-07-03T21:04:36.273 回答