我在WPF中验证问题,我似乎无法解决。我有一个类(实现IDataErrorInfo),它使用类似的属性。
private double? _SizeSearchValue;
public double? SizeSearchValue
{
get { return _SizeSearchValue; }
set
{
_SizeSearchValue = value;
NotifyChange("SizeSearchValue");
ValidateInputRow("SizeSearchValue");
}
}
它绑定到XAML中的文本框,就像这样。
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" Text="Size:"/>
<ComboBox Text="{Binding SizeSearchOption, ValidatesOnDataErrors=True}"/>
<TextBox Text="{Binding SizeSearchValue, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=False}"/>
</StackPanel>
属性setter中的ValidateInputRow()函数通常会通过并运行我的自定义验证例程并适当地设置错误,以便上面提到的StackPanel中的ComboBox和TextBox具有红色边框。一切正常,直到我将非数字字符串放入文本框(例如“Abc”)。
使用字符串输入,绑定运行其默认验证,引发FormatException,文本框按常规获取其红色边框。我的问题是我的自定义验证例程永远不会运行,因为我的类中的属性setter永远不会被调用。
我理解为什么会发生这种情况,但我想知道是否有人知道如何捕获事件或违规的FormatException以便我可以在事后运行自定义验证。我似乎无法想出这个。
答案 0 :(得分:1)
好的,好像我回答了我自己的问题。我进一步研究了FormatException堆栈跟踪,发现该过程涉及'IValueConverter',所以......解决方案就是使用这样的转换器:
<TextBox Text="{Binding SizeSearchValue, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource TestConverter}}"/>
在我的情况下,我只是快速打了一个(TestConverter)并将其绑定到我的自定义验证规则。问题解决了。我想知道这个问题是否有任何等效解决方案?