错误模板绑定错误wpf

Ber*_*ryl 2 .net data-binding validation wpf controltemplate

运行我的应用程序时,我在控制台中收到此错误:

System.Windows.Data Error: 17 : Cannot get 'Item[]' value (type 'ValidationError') from '(Validation.Errors)' (type 'ReadOnlyObservableCollection`1'). BindingExpression:Path=AdornedElement.(0)[0].ErrorContent; DataItem='AdornedElementPlaceholder' (Name='placeholder'); target element is 'TextBlock' (Name=''); target property is 'ToolTip' (type 'Object') ArgumentOutOfRangeException:'System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: index'
A first chance exception of type 'NHibernate.Validator.Exceptions.ValidatorConfigurationException' occurred in NHibernate.Validator.dll
Run Code Online (Sandbox Code Playgroud)

我不明白的其中一个问题是应用程序行为很好,单元测试也是如此.

我(显然)在IDataErrorInfo实现的幕后使用了NHibernate验证器,但最重要的是IDataErrorInfo.Error和IDataErrorInfo [columnName]如果有错误将返回单个字符串,如果没有则返回null .

我猜这个异常是因为当没有错误时,没有索引,但是我的错误工具提示的绑定似乎是关于如何做的典型例子.

我的错误模板的绑定如下.

问题:

  1. 如果没有找到错误,IDataErrorInfo [columnName]应该返回null吗?
  2. 是我的错误模板缺乏?validation.HasError部分??
  3. 这甚至是个问题吗?
  4. 如果它是一个问题,它可能与NHib验证器和建议有关?

带有错误模板的文本框样式:

<Style TargetType="{x:Type TextBox}">
    <Setter Property="Margin" Value="0,0,16,0" />        
    <!-- Error display -->
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <DockPanel LastChildFill="True">
                    <TextBlock DockPanel.Dock="Right" Text=" *" 
                               Foreground="Red" 
                               FontWeight="Bold" FontSize="16" 
                               ToolTip="{Binding ElementName=placeholder, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"/>
                    <Border BorderBrush="Red"  BorderThickness="1">
                        <AdornedElementPlaceholder Name="placeholder"></AdornedElementPlaceholder>
                    </Border>
                </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="True">
            <Setter Property="Background" Value="LightYellow"/>
        </Trigger>
    </Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)

Cod*_*ked 6

  1. 根据IDataErrorInfo文档,它默认返回一个空字符串.因此,如果没有错误,您应该返回string.Empty.

  2. Josh Smith的博客中,您可以使用CurrentItem代替[0]来避免错误.