数据绑定:用于不同目的的不同触发器

时间:2012-07-19 09:40:40

标签: wpf data-binding mvvm

我有一个带有数据验证的WPF MVVM数据表单窗口。很多控件都是文本框。目前,数据绑定触发器设置为默认值,即i。即失去焦点。这意味着只有在可能完全填写字段时才会验证该字段。因此,当删除数字并键入另一个数字时,瞬态空值将不会显示为输入错误。

但缺点是只有当焦点移出文本框时才能启用“保存”按钮。 (无论在哪里,只是在编辑后的控件之外。假设还有其他任何可调焦的东西。)如果这是唯一的更改,则用户等待“保存”按钮可用且没有任何反应。对于Save按钮,我想使用立即绑定触发器。怎么办?

编辑:忘记提及我的保存按钮(使用ICommand)仅在输入被确定为已修改且有效时才启用。因此,在数据绑定更新之前,数据将保持不变,直到焦点移动到另一个控件时才会发生。

3 个答案:

答案 0 :(得分:1)

我实际上有一段时间a similar question,我最后使用的解决方案是一个自定义DependencyProperty,当按下某个键时启动了一个计时器,并且只实际处理了PropertyChange通知如果特定时间过去了。

这意味着绑定属性不会更新(和验证),除非用户在键入一段时间后暂停。

代码可以找到here(可能需要一些清理),它的使用方式如下:

<TextBox
    local:DelayedUpdateBehavior.TargetProperty="{x:Static TextBox.TextProperty}"
    local:DelayedUpdateBehavior.Milliseconds="1000"
    Text="{Binding MyTextProperty, UpdateSourceTrigger=Explicit}" />

修改:实际上this link可能会更好。它是一个标记扩展,因此您可以直接从绑定中使用它。我不记得我过去使用的这两种方法中的哪一种,但我知道它是其中之一:)

<TextBox Text="{local:DelayBinding Path=MyTextProperty, Delay='00:00:01'}" />

答案 1 :(得分:0)

假设您正在为按钮点击事件使用ICommand类型界面:

您可以...使用INotifyPropertyChanged实现字符串属性并将它们绑定到文本框控件。现在,在您的Command canexecute方法中,您可以检查该属性是否为!nullorempty。

e / grammar

答案 2 :(得分:-1)

将Binding的UpdateSourceTrigger属性设置为PropertyChanged。 TextBoxes的默认值为LostFocus

更新:所以你想让你的TextBox上的数据绑定工作,只允许数字吗?看看这个问题:Create WPF TextBox that accepts only numbers

或者使用转换器并将Save按钮的IsEnabled属性绑定到TextBox(如果有多个,可以使用MultiBinding),并使用转换器确定文本是否为有效数字并返回true或false。