WPF绑定和验证

时间:2010-12-01 17:56:27

标签: wpf validation binding

我在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以便我可以在事后运行自定义验证。我似乎无法想出这个。

1 个答案:

答案 0 :(得分:1)

好的,好像我回答了我自己的问题。我进一步研究了FormatException堆栈跟踪,发现该过程涉及'IValueConverter',所以......解决方案就是使用这样的转换器:

<TextBox Text="{Binding SizeSearchValue, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource TestConverter}}"/>

在我的情况下,我只是快速打了一个(TestConverter)并将其绑定到我的自定义验证规则。问题解决了。我想知道这个问题是否有任何等效解决方案?