WPF DataGrid验证错误未被捕获

Ber*_*ryl 1 validation wpf datagrid

我试图在DataGrid中的单元格上使用异常验证以及DataGridTextColumn的EditingElementStyle上的样式来设置带有错误内容的工具提示.发生错误但未在WPF中捕获或显示.

代码和异常如下所示.有人能告诉我我需要解决这个问题吗?

干杯,
Berryl

这是例外:

System.Windows.Data Error: 8 : Cannot save value from target back to source. 
BindingExpression:Path=Allocations[6].Amount; DataItem='ActivityViewModel' (HashCode=-938045583); 
target element is 'TextBox' (Name=''); 
target property is 'Text' (type 'String') 
TargetInvocationException:'System.Reflection.TargetInvocationException: 
Exception has been thrown by the target of an invocation. ---> 
Domain.Core.PreconditionException: An allocation must be less than one day.
Run Code Online (Sandbox Code Playgroud)

这是DataGridTextColumn的xaml:

<dg:DataGridTextColumn 
    ....                
    EditingElementStyle="{StaticResource cellEditStyle}"
    Binding="{Binding Allocations[6].Amount, Converter={StaticResource amtConv}, 
        ValidatesOnExceptions=True}"
                               />
Run Code Online (Sandbox Code Playgroud)

以下是应该提供Tooltip错误反馈的样式:

    <Style x:Key="cellEditStyle" TargetType="{x:Type TextBox}">
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Padding" Value="0"/>
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter 
                Property="ToolTip" 
                Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
        </Trigger>
    </Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)

Red*_*yph 5

这可能有点晚了,但是由于我遇到了同样的问题,这里有一个解决方法可供进一步参考(使用.NET 4.0.30319测试).

1)捕捉异常

虽然原始帖子中的以下绑定代码适用于TextBox,例如,它没有DataGrid文本单元格(即使Msn文档声明如此):

<!-- Doesn't work -->
<DataGridTextColumn Binding="{Binding Path=Age, ValidatesOnExceptions=True}"
                    ...
                    />
Run Code Online (Sandbox Code Playgroud)

你必须添加这个位:

<DataGridTextColumn Binding="{Binding Path=Age, Mode=TwoWay, ValidatesOnExceptions=True}"
                    ...
                    />
Run Code Online (Sandbox Code Playgroud)

请注意,奇怪的是(无论如何),异常将被捕获并显示在行标题中的感叹号.你不会有红色边框,也没有可能在没有Mode=TwoWay零件的情况下应用样式.

2)应用风格

另一个困难是在出现错误时设置样式,因为编辑元素将在您开始验证过程后立即关闭.所以附上一个样式:

<!-- Doesn't work -->
<DataGridTextColumn Binding="{Binding Path=Age, Mode=TwoWay, ValidatesOnExceptions=True}"
                    EditingElementStyle="{StaticResource datagridTBStyle}"
                    ...
                    />
Run Code Online (Sandbox Code Playgroud)

如果你想触发验证错误,它将无法工作.同样,CellStyle没有错误标志来触发.你必须使用一个技巧并声明一个FrameworkElement样式,如下所示:

<DataGridTextColumn Binding="{Binding Path=Age, Mode=TwoWay, ValidatesOnExceptions=True}"
                    ElementStyle="{StaticResource datagridElemStyle}"
                    ...
                    />
Run Code Online (Sandbox Code Playgroud)

好消息是你可以在派生元素上定义样式,比如TextBlock,并从它们的属性中受益:

<Style x:Key="datagridElemStyle" TargetType="{x:Type TextBlock}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="True">
      <Setter Property="Background" Value="Yellow" />
      <Setter Property="ToolTip" 
              Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)