【问题标题】:Error Template Binding error wpf错误模板绑定错误 wpf
【发布时间】:2011-07-12 21:57:35
【问题描述】:

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

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>

【问题讨论】:

    标签: .net wpf validation data-binding controltemplate


    【解决方案1】:
    1. 基于IDataErrorInfo 文档,它默认返回一个空字符串。因此,如果没有错误,您可能应该返回 string.Empty。

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

    【讨论】:

    • suh-weet。不知道为什么 MS 也不能在文档中说清楚。也同意你关于 string.Empty 的返回,尽管我使用基于 Josh Smith 著名的 MVVM 演示应用程序的 null 。我查看了数据绑定代码,实际上 null 和 empty 都被视为相同。干杯
    【解决方案2】:

    纯凭记忆(所以很可能是错误的)我认为当您在视觉层次结构中实际上没有装饰层时也会发生这种情况;您是否有机会自定义 Window 模板?显然不记得确切的例外情况,但不久前我也发生过类似的事情。排除这种情况的最简单方法是将装饰层手动放置在某处 - 您可以查看 MSDN 上的默认 Window 控件模板以了解它的使用方式。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多