猿问

文本框绑定到 uint - 用户输入验证

我有 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 中的反馈如下所示:

http://img2.mukewang.com/6199fe680001bcdc04640145.jpg

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

  1. 因为,转换检查(到 uint)不是由我的代码完成的,我猜这是一个自动化的 .NET 事情?这是否足够/好的做法,还是我必须自己对输入进行额外检查?

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


翻翻过去那场雪
浏览 173回答 2
2回答

慕虎7371278

因为,转换检查(到 uint)不是由我的代码完成的,我猜这是一个自动化的 .NET 事情?嗯,是的,您不能将uint属性设置为有效值以外的任何其他uint值。当您尝试执行此操作时,WPF 绑定引擎将捕获异常。这是否足够/好的做法,还是我必须自己对输入进行额外检查?如果需要,您可以使用 a 自定义“值...无法转换”消息ValidationRule,但不应更改源属性的类型。如果输入无效并且用户按下提交按钮,我想将 GUI 中的文本框更新为最后一个有效值(我仍然保存在相应的视图模型属性中)。使用已经到位的数据绑定来做到这一点的最佳方法是什么?PropertyChanged在Execute绑定到 的命令的方法中引发源属性的事件Button。

元芳怎么了

我发现最好的解决方案是让 ViewModel 用字符串属性包装整数字段,并在设置新值时使用 int.TryParse 来验证它。否则您无法验证 TextBox,因为无效值无法发送到 ViewModel,因此您不了解它们。这是一个常见问题,您可以通过搜索 INotifyDataErrorInfo 找到更多信息(验证后应该如何显示错误消息)
随时随地看视频慕课网APP
我要回答