【发布时间】:2015-03-23 13:58:35
【问题描述】:
我正在为绑定到 TextBox 的双重类型属性实现验证规则。问题是,当我在十进制数字中输入 0 时,如果结果数字被规则接受,WPF 会删除最后一个 0,因为它理解它在数学上是虚拟的。这可以防止我在其后输入非 0 数字。
例如,我无法输入 5.101,因为当我达到 5.10 时,WPF 会擦除 0,然后我又回到 5.1。
当我赶上 5.10 时,我可以通过返回失败的 ValidationResult 来解决此问题,因为在这种情况下 WPF 不会删除 0。但这会被样式(红色边框)作为失败处理,并且会让用户感到困惑。
有更好的解决方法的想法吗?
验证在一个继承自ValidationRule的类中处理,Validate方法就是这个。
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
double dValue = 0.0;
string sValue;
string definition = "Enter number in [ " + Min + "; " + Max + "]";
// Catch non-double, empty, minus sign
try
{
sValue = (string)value;
if (sValue == "-")
return new ValidationResult(false, definition);
else if (sValue.Length > 0)
dValue = double.Parse(sValue);
else // Empty entry
return new ValidationResult(false, definition);
}
catch (Exception ex)
{
return new ValidationResult(false, "Invalid entry: " + ex.Message);
}
// Forbid finishing with dot but return false to allow keyboard input
if (sValue.EndsWith("."))
return new ValidationResult(false, "Cannot end with '.'");
// Check range
if (dValue < Min || dValue > Max)
return new ValidationResult(false, definition);
else
{
// Workaround to allow input of 0
if (sValue.Contains(".") && sValue.EndsWith("0"))
return new ValidationResult(false, "Accepted");
else
return new ValidationResult(true, null);
}
}
问题似乎与来自对象的反馈有关。当我从 TwoWay 更改为其他内容时,验证不再阻止输入 0。不幸的是,我第一次绑定对象时确实需要 TextBox 来显示对象的内容。但在那之后,我可以只使用 OneWayToSource,因为我可以重置 DataContext 以进行更新。当我将对象附加到 DataContext 时,有没有办法用属性值填充 TextBox,而在 OneWayToSource 中(我的意思不是明确设置其文本)?
【问题讨论】:
-
你能把你正在使用的代码贴出来吗?
-
抱歉代码不可读,我正在研究如何以可读的方式显示它。
-
只需编辑您的问题并使用代码格式化选项将代码放在那里。您不能在 cmets 中格式化代码。
-
我不确定这是否有帮助,但您是否尝试过在绑定中使用格式字符串?像这样:stackoverflow.com/a/18362876/983064
-
谢谢,我试过了,但字符串格式迫使我输入精确格式的数字,并且有一个烦人的行为。如果我想输入 5.1,当我按 5 时,它会自动带来指定数量的 0 数字,如果我输入 0.1,它不理解它并在添加 0 之前输入它。相当麻烦的行为。
标签: c# wpf validation textbox number-formatting