我有4个带有“提交”按钮的用户输入,例如:
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中的反馈如下所示:
现在,我有以下两个问题:
答案 0 :(得分:1)
由于我的代码未完成(到uint的)转换检查,所以我猜这是自动化的.NET吗?
是的,除了有效的uint
值之外,您不能将uint
属性设置为其他任何值。当您尝试执行此操作时,WPF绑定引擎将捕获该异常。
这是否足够/很好的实践,还是我必须自己对输入内容进行额外的检查?
如果愿意,您可以使用ValidationRule
自定义“无法转换...值...”消息,但是您不应更改源属性的类型。
如果输入无效,并且用户按下了Submit按钮,我想将GUI中的文本框更新为最后一个有效值(我仍然将其保存在相应的viewmodel属性中)。使用已经存在的数据绑定来做到这一点的最佳方法是什么?
在绑定到PropertyChanged
的命令的Execute
方法中,为源属性引发Button
事件。
答案 1 :(得分:0)
我发现最好的解决方案是ViewModel使用字符串属性包装整数字段,并在设置新值时使用int.TryParse来验证新值。
否则,您将无法验证TextBox,因为无效值无法发送到ViewModel,因此您不了解它们。
这是一个常见问题,通过搜索INotifyDataErrorInfo(在验证后应该如何显示错误消息),您会发现更多信息