1

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

但一个缺点是,保存按钮只能在焦点移出文本框时启用。(无论在哪里,都超出了编辑控件。假设还有其他可聚焦的内容。)如果这是唯一的更改,则用户等待“保存”按钮可用,但什么也没有发生。对于保存按钮,我想使用立即绑定触发器。怎么可能呢?

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

4

3 回答 3

1

实际上我不久前有一个类似的问题,我最终使用的解决方案是一个自定义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'}" />
于 2012-07-19T13:30:20.497 回答
0

假设您为按钮单击事件使用 ICommand 类型的接口:

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

e/ 语法

于 2012-07-19T12:29:27.670 回答
-1

将 Binding 的UpdateSourceTrigger属性设置为PropertyChanged. 文本框的默认值为LostFocus.

更新:所以你想让数据绑定在你的 TextBox 上工作并且只允许数字?看看这个问题:创建只接受数字的 WPF 文本框

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

于 2012-07-19T09:48:39.113 回答