2013-07-03 52 views
5

我有一个可以正常工作的C#WPF MVVM应用程序。关于丢失焦点的WPF RaisePropertyChanged事件

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

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

因此,恢复:

该序列正常工作:

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

该序列给我一个错误:

  1. 编辑在保存菜单按钮
  2. 数据文本框中
  3. 点击与正​​确的价值观

如何解决这个保存?

回答

10

这是WPF和WinForms中TextBoxes的常见陷阱。您可以通过指示绑定系统在每次更改文本框时更新虚拟机,而不是在失去焦点时解决此问题。为此,请将绑定的UpdateSourceTrigger设置为PropertyChanged。这会在任何时候TextBox为其Text属性引发PropertyChanged事件而回写给VM。

<TextBox Text="{Binding MyText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
8

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