验证异常Silverlight验证



我在验证网格的DataTemplate列中的文本框时遇到了问题。文本框绑定到的属性是一个"double"值。这是我的文本框的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"和我的模型类现在也继承自IDataErrorInfo和我已经实现了IDataErrorInfo成员在我的类

  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;
            }
        }

这是工作(除了工具提示显示在错误的地方,但这很好)。我仍然不明白为什么我的代码没有捕获任何异常。有什么我必须添加到我的模型类吗?

如果Visual Studio设置为在用户未处理的异常时中断,它将在验证框架处理异常之前中断。您可以告诉调试器在调试时忽略验证异常,这样可以让验证框架处理异常而不中断执行。

你的setter代码抛出一个异常,你的调用/客户端代码处理/拦截异常吗?

很可能不是,这就是为什么你得到一个"unhandle异常"。

一个简单的测试,将抛出异常改为弹出一个消息框,unhandle异常将消失

最新更新