错误模板绑定错误WPF

问题描述:

我在控制台中这个错误,当我跑我的应用程序:错误模板绑定错误WPF

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没有。

我想这个异常是因为当没有错误时没有索引,但是对于我的错误工具提示的绑定似乎是典型的关于如何执行它的示例。

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

问题:如果没有发现错误

  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> 

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

  2. Josh Smith's blog开始,可以使用CurrentItem代替[0]来避免错误。

+0

suh-weet。不确定MS为什么不能在文档中明确说明。同意你关于字符串的返回。虽然我使用基于Josh Smith着名的MVVM演示应用程序的null,但它也是空的。我看着数据绑定代码,并且null和empty实际上都是相同的。干杯 – Berryl 2011-03-10 20:19:06

单纯从内存(所以最有可能是错误的)我认为,也有可能发生时,你实际上并没有在上面的视觉层次装饰器层;你有没有自定义窗口模板?显然,我不记得确切的例外,但是我后来发生了类似的事情。排除这种情况的最简单方法是手动将装饰图层置于某处 - 您可以查看MSDN上的默认Window控件模板,以了解它的使用方式。

编辑:实际上,应该导致一个NRE,就像我说的,很可能是错误的。