我有一个带有数据验证的WPF MVVM数据窗体窗口。许多控件都是文本框。目前,数据绑定触发器被设置为默认值,即失去焦点。这意味着一个字段只有在可能被完全填写时才被验证。因此,当删除一个数字并键入另一个数字时,临时空值将不会显示为输入错误。
但缺点是只有当焦点移出文本框时才能启用"保存"按钮。(无论在哪里,都在编辑的控件之外。假设还有其他可聚焦的内容。)如果这是唯一的更改,用户将等待"保存"按钮可用,但不会发生任何事情。对于"保存"按钮,我希望使用立即绑定触发器。如何做到这一点?
编辑:忘记了,我的保存按钮(使用ICommand)只有在输入被确定为修改和有效时才会启用。因此,在数据绑定更新数据之前,数据将保持不变,而在焦点移动到另一个控件之前,这种情况不会发生。
事实上,我不久前也遇到过类似的问题,我最终使用的解决方案是一个自定义的DependencyProperty
,它在按下某个键时启动计时器,并且只有在特定时间过去时才实际处理PropertyChange
通知。
这意味着绑定属性不会得到更新(和验证),除非用户暂停键入一段时间。
代码可以在这里找到(可能需要一些清理),它是这样使用的:
<TextBox
local:DelayedUpdateBehavior.TargetProperty="{x:Static TextBox.TextProperty}"
local:DelayedUpdateBehavior.Milliseconds="1000"
Text="{Binding MyTextProperty, UpdateSourceTrigger=Explicit}" />
编辑:实际上这个链接可能更好。它是一个标记扩展,因此您可以直接从绑定中使用它。我不记得我过去使用过这两种方法中的哪一种,但我知道这是其中之一:)
<TextBox Text="{local:DelayBinding Path=MyTextProperty, Delay='00:00:01'}" />
假设您使用ICommand类型的界面来处理按钮点击事件:
你可以。。。使用INotifyPropertyChanged实现字符串属性,并将它们绑定到文本框控件。现在,在Command canexecute方法中,您可以检查属性是否为!空。
e/grammar
将绑定的UpdateSourceTrigger
属性设置为PropertyChanged
。TextBoxes的默认值为LostFocus
。
更新:所以你想让数据绑定在你的TextBox上工作,只允许数字?看看这个问题:创建只接受数字的WPF文本框
或者使用转换器将Save按钮的IsEnabled属性绑定到TextBox(如果有多个,可以使用MultiBinding),并使用转换器来确定文本是有效数字并返回true还是false。