验证错误模板 - 绑定异常

17

我正在使用以下模板来处理验证错误

<ControlTemplate>
    <Border BorderBrush="Red" BorderThickness="1">
        <Grid>
            <Polygon Points="8,8 8,0 0,0"
                     Stroke="Black"
                     StrokeThickness="1"
                     Fill="Red"
                     HorizontalAlignment="Right"
                     VerticalAlignment="Top"
                     ToolTip="{Binding ElementName=adorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
            <AdornedElementPlaceholder x:Name="adorner"/>
        </Grid>
    </Border>
</ControlTemplate>

ToolTip使用正常,但在离开当前记录后抛出以下异常:

System.Windows.Data Error: 17 : 无法从'(Validation.Errors)' (类型 'ReadOnlyObservableCollection`1')获取'Item[]'值(类型 'ValidationError')。 BindingExpression: Path = AdornedElement.(0)[0].ErrorContent; DataItem='AdornedElementPlaceholder' (Name='adorner'); target element is 'Polygon' (Name=''); target property is 'ToolTip' (type 'Object') ArgumentOutOfRangeException:'System.ArgumentOutOfRangeException: 指定的参数超出了有效范围。

我尝试使用HasError属性,但失败了。有人有任何想法吗?


1个回答

31

当没有验证错误时,绑定仍在尝试访问 Validation.Errors 返回的 ReadOnlyObservableCollection 中的第一个元素,但由于为空,因此会引发异常。

绑定系统只是吞下了异常,但这仍然很烦人且不必要。

与其这样绑定:

Path=AdornedElement.(Validation.Errors)[0].ErrorContent

你可以这样做,以避免出现异常:

Path=AdornedElement.(Validation.Errors).CurrentItem.ErrorContent

谢谢,我不知道CurrentItem,我的错没有检查。 - Goran
1
感谢您的解决方案。不幸的是,几乎所有的教程都使用 Path=AdornedElement.(Validation.Errors)[0].ErrorContent。但是使用 CurrentItem 会出现一个新问题:ReSharper无法解析“CurrentItem”。您对此有什么提示吗? - Bernhard Hiller
1
@BernhardHiller,您可以像这样添加前缀:Path=AdornedElement.(Validation.Errors).(componentModel:ICollectionView.CurrentItem).(ValidationError.ErrorContent).(validation:CustomErrorType.Message)。请注意,最后一部分“CustomErrorType”是我的自定义类 - 您的可能不同。 - Jon Barker
@JonBarker 这对我不起作用。我得到了Cannot get 'CurrentItem' value (type 'Object') from '(Validation.Errors)' (type 'ReadOnlyObservableCollection1').尽管使用.CurrentItem`确实有效。当未进行强制转换时,我不确定后台正在发生什么。 - RedX
3
如果您收到了错误报告,请查看 https://dev59.com/S1YN5IYBdhLWcg3wm5IL#47556421。 - gbianchi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接