我在网格的DataTemplate列中验证文本框时遇到问题。文本框绑定的属性是“double”值。这是我的TextBox
的xaml代码 <TextBox Text="{Binding SubTotalRawHours, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}"
MinHeight="24" VerticalAlignment="Top" BindingValidationError="ValidateTime" />
这是属性
private double _SubTotalRawHours;
public double SubTotalRawHours
{
get { return _SubTotalRawHours; }
set
{
if (value < 0)
{
throw new Exception("Value not allowed");
}
_SubTotalRawHours = value;
NotifyPropertyChanged("SubTotalRawHours");
}
}
现在奇怪的问题是,如果我输入字母,代码会显示错误消息“输入格式不正确”的工具提示,这是正确的。但是,如果我输入一个负值,我会得到一个异常“异常没有被代码处理”。 发生在这里
if (value < 0)
{
throw new Exception("Value not allowed");
}
我已尝试过所有内容,我甚至试图将文本框放在网格外但不起作用。
非常感谢这里的一些投入。
修改1
好的,现在我对代码进行了一些更改,我有一个解决方法,而不是"ValidatesOnExceptions=True"
,我有"ValidatesOnDataErrors=True"
,我的Model类现在也继承自IDataErrorInfo
和我已经在我的课程中实现了IDataErrorInfo memeber
private string _dataError = string.Empty;
const string _ErrorsText = "Errors";
string IDataErrorInfo.Error
{
get { return _dataError; }
}
public string this[string propertyName]
{
get
{
_dataError = null;
switch (propertyName)
{
case "OldHours":
if (OldHours < 0 || OldHours > 100)
{
return "Please enter a value between 0 - 100.";
}
break;
}
return null;
}
}
这是有效的(除了工具提示显示在错误的地方,但没关系)。我仍然无法理解为什么我的代码没有捕获任何异常。我有什么必须添加到我的模型类中吗?
答案 0 :(得分:1)
如果将Visual Studio设置为中断用户未处理的异常,则在验证框架处理异常之前它将中断。调试时可以tell the debugger to ignore validation exceptions,这样验证框架可以在不中断执行的情况下处理异常。
答案 1 :(得分:-3)
你的setter代码抛出一个异常,你的调用/客户端代码是否处理/拦截异常?
很可能不是,这就是为什么你得到一个“不可处理的例外”。
一个简单的测试,更改throw异常以弹出一个消息框,unhandle异常将消失。