【问题标题】:Textbox binding to uint - user input validation文本框绑定到 uint - 用户输入验证
【发布时间】:2018-08-09 12:10:41
【问题描述】:

我有 4 个带有“提交”按钮的用户输入,如下所示:

for Texboxes 绑定到视图模型中的 uint 变量并使用“标准”OnPropertyChanged() 方式,例如:

    /// <summary>
    /// Width of the exported image
    /// </summary>
    public uint ImageExportWidth
    {
        get { return imageExportWidth; }
        set
        {
            if (value > 0 && value < 10000)
            {
               imageExportWidth = value;
            }
            else
            {
                GuiCommons.ModernDialogShowMessage(GeneralDefines.SizeNotSupported, DefOmegaMessageBox.OmegaException);
            }
            OnPropertyChanged("ImageExportWidth");
        }
    }

如果用户按下提交按钮,这些值将写入一个 init 文件,该文件稍后用于导出过程。

如果现在输入无效,则视图模型中的值已经没有更新,GUI 中的反馈如下所示:

现在,我有以下两个问题:

  1. 由于我的代码没有完成转换检查(到 uint),我猜这是一个自动化的 .NET 事情?这是否足够/良好的做法,还是我必须自己对输入进行额外检查?
  2. 如果输入无效并且用户按下提交按钮,我想将 GUI 中的文本框更新为最后一个有效值(我仍然保存在相应的视图模型属性中)。使用已经到位的数据绑定来做到这一点的最佳方法是什么?

【问题讨论】:

  • For 1:这是基于异常的默认 WPF 验证规则。如果你对此感到满意,你就不需要更多了。对于 2:您可以为此使用 BindingGroup.CancelEdit(例如阅读 here)。
  • @dymanoid 我是否理解正确:这是在 xaml 的 Code-Behind .cs 文件中完成的,按下按钮调用我使用 BindingGroup.CancelEdit 的函数?

标签: c# wpf validation data-binding


【解决方案1】:

由于我的代码没有完成转换检查(到 uint),我猜这是一个自动化的 .NET 事情?

嗯,是的,除了有效的uint 值之外,您不能将uint 属性设置为任何其他值。当您尝试执行此操作时,WPF 绑定引擎将捕获异常。

这是否足够/良好的做法,还是我必须自己对输入进行额外检查?

如果您愿意,您可以使用 ValidationRule 自定义“值...无法转换”消息,但您不应更改源属性的类型。

如果输入无效并且用户按下提交按钮,我想将 GUI 中的文本框更新为最后一个有效值(我仍然保存在相应的视图模型属性中)。使用已有数据绑定的最佳方法是什么?

在绑定到Button 的命令的Execute 方法中为源属性引发PropertyChanged 事件。

【讨论】:

  • 谢谢,这正是我想做的。有时解决方案就在您面前,但您却看不到它。 :) dymanoid 关于使用BindingGroup 的评论可能也有效,但在我的情况下,这绝对是更直接的方式。
【解决方案2】:

我发现最好的解决方案是让 ViewModel 用字符串属性包装整数字段,并在设置时使用 int.TryParse 验证新值。

否则您无法验证 TextBox,因为无效值无法发送到 ViewModel,因此您不知道它们。

这是一个常见问题,您可以通过搜索 INotifyDataErrorInfo 找到更多信息(这是您在验证后应该如何显示错误消息)

【讨论】:

  • 我在软件的其他区域中使用TryParse 函数和NumberFormatInfo 直接更新数据(无需用户先按按钮),但是这里似乎默认的WPF验证规则更方便。
  • 所以你建议所有源属性都应该是字符串...?
  • @mm8 - 字符串的源属性,是的。源属性应与 WPF 期望的类型匹配,因此 IsEnabled 应绑定到 bool,而 Width 应绑定到 GridLength 等。可以限制数字字段,使其始终为有效整数,但不是如果它永远不能为空,或者只是句号或减号,则非常用户友好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多