IValueConverter和异常验证

时间:2011-06-22 12:06:49

标签: c# silverlight

我正在使用自定义DateTimeToString:IValueConverter

在我的ConvertBack方法中,我在转换失败时抛出异常,但它没有显示为验证失败(这是一个未处理的应用程序异常),我想将其显示为验证问题(红色边框)。

简而言之,我想让它像DateTime + Texbox一样工作,当它显示验证消息(“输入字符串的格式不正确”),但我的自定义IValueConverter。

4 个答案:

答案 0 :(得分:7)

虽然我原则上同意winSharp93的回答https://stackoverflow.com/a/6439620/29491,但我发现如果您从ValidationResult方法返回ConvertBack,则会得到预期的验证行为。

如果您使用TryParse方法,则需要使用下面指出的TryParseExactFormatException方法或抓住Parse

DateTime result;
if (DateTime.TryParseExact(dateString, dateFormat, culture, DateTimeStyles.None, out result))
{
    return result;
}
else 
{
    return new ValidationResult("Date string format error");
}

答案 1 :(得分:4)

刚刚发现这是ivalueconverter的已知行为。这是因为ivalueConverter不是Silverlight中“验证管道”的一部分。因为ivalueConverter在到达验证逻辑之前会抛出异常,所以它不会被视为验证错误。对于同样的问题,存在a post in Silverlight forum。有人有started a request at dotnet.uservoice。我个人认为这应该是固定/改进的,因为转换器是验证错误的合理位置。毕竟,我们多久会收到一次转换错误?很多!

答案 2 :(得分:1)

虽然可以使用ValueConverters,但我不推荐它。

最好看看MVVM-Pattern(另请参阅:Thought: MVVM eliminates 99% of the need for ValueConverters)。然后,您可以在ViewModel中实现IDataErrorInfo,并且验证变得非常简单。

根据我的经验,坚持使用ValueConverts只会让您更头疼。

答案 3 :(得分:1)

在使用值转换器和MVVM模式时,我遇到了类似的问题。问题与在视图模型中数据绑定中设置值有关。绑定被触发并且propertychangedevent被引发。因此,价值已经改变,然后转换器被调用。

如果引发属性更改事件然后调用convertor,则即使已将ValidatesOnException指定为true,也会抛出未处理的异常。这是因为绑定已经因触发属性更改事件而更新。然后转换器被触发并抛出异常,但控件无法捕获它。

我将转换器中的逻辑移动到ViewModel绑定属性的setter中进行验证。只有数据有效时才会触发NotifyPropertyChangedEvent。否则,我会抛出UI使用绑定的ValidatesOnException属性显示的异常。

希望这有帮助。