我正在使用自定义DateTimeToString:IValueConverter
在我的ConvertBack方法中,我在转换失败时抛出异常,但它没有显示为验证失败(这是一个未处理的应用程序异常),我想将其显示为验证问题(红色边框)。
简而言之,我想让它像DateTime + Texbox一样工作,当它显示验证消息(“输入字符串的格式不正确”),但我的自定义IValueConverter。
答案 0 :(得分:7)
虽然我原则上同意winSharp93的回答https://stackoverflow.com/a/6439620/29491,但我发现如果您从ValidationResult方法返回ConvertBack,则会得到预期的验证行为。
如果您使用TryParse方法,则需要使用下面指出的TryParseExact或FormatException方法或抓住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属性显示的异常。
希望这有帮助。