.net 错误模板绑定错误wpf

.net 错误模板绑定错误wpf,.net,wpf,validation,data-binding,controltemplate,.net,Wpf,Validation,Data Binding,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='Adorne

当我运行我的应用程序时,在控制台中出现此错误:

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
关于这一点,我还不明白的一点是,应用程序的行为和单元测试一样良好

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

我猜出现异常是因为当没有错误时,就没有索引,但是我的错误工具提示的绑定似乎是如何执行的典型示例

下面是我的错误模板的绑定

问题:

  • 如果没有发现错误,IDataErrorInfo[columnName]不应该返回null吗
  • 是否缺少我的错误模板?validation.HasError部分
  • 这是个问题吗
  • 如果这是一个问题,并且很可能与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>
    
    
    
    纯粹从内存(因此很可能是错误的)我认为,如果在视觉层次结构中没有实际的装饰层,也可能发生这种情况;您是否有机会自定义窗口模板?显然,我记不起确切的例外情况,但不久前类似的事情发生在我身上。排除这种情况的最简单方法是手动将装饰器层放置在某个位置—您可以查看MSDN上的默认窗口控件模板以了解其使用方式

    编辑:事实上,这应该会导致NRE,就像我说的,很可能是错的

  • 根据文档,它默认返回一个空字符串。所以,如果没有错误,您可能应该返回string.Empty

  • 从中,您可以使用CurrentItem代替[0]来避免错误


  • 苏威。我不知道为什么微软在文档中也不能说清楚。同意你关于返回string.Empty的说法,尽管我使用了Josh Smith著名的MVVM演示应用程序中基于null的部分。我查看了数据绑定代码,null和empty实际上被视为相同的。干杯