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

时间:2018-08-09 12:10:42

标签: c# wpf validation data-binding

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

user input with submit button

for Texbox绑定到viewmodel中的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");
        }
    }

如果用户按下“提交”按钮,则这些值将被写入一个初始化文件,该文件随后将用于导出过程。

如果现在输入无效,则不会更新viewmodel中的值,并且GUI中的反馈如下所示:

enter image description here

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

  1. 因为我的代码未完成(到uint的)转换检查,所以我猜这是自动化的.NET吗?这是否足够/很好的做法,还是我必须自己对输入内容进行额外的检查?
  2. 如果输入无效,并且用户按下了Submit按钮,我想将GUI中的文本框更新为最后一个有效值(我仍然将其保存在相应的viewmodel属性中)。使用已经存在的数据绑定执行此操作的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

  

由于我的代码未完成(到uint的)转换检查,所以我猜这是自动化的.NET吗?

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

  

这是否足够/很好的实践,还是我必须自己对输入内容进行额外的检查?

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

  

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

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

答案 1 :(得分:0)

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

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

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