我试图在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.
以下是DataGridTextColumn的xaml:
<dg:DataGridTextColumn
....
EditingElementStyle="{StaticResource cellEditStyle}"
Binding="{Binding Allocations[6].Amount, Converter={StaticResource amtConv},
ValidatesOnExceptions=True}"
/>
以下是应该提供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>
答案 0 :(得分:5)
这可能有点晚了,但是由于我遇到了同样的问题,这里有一个可以进一步参考的解决方法(使用.NET 4.0.30319进行测试)。
1)捕捉异常
虽然原始帖子中的以下绑定代码适用于TextBox,但是它没有DataGrid文本单元格(即使Msn文档说明了这一点):
<!-- Doesn't work -->
<DataGridTextColumn Binding="{Binding Path=Age, ValidatesOnExceptions=True}"
...
/>
您必须添加此位:
<DataGridTextColumn Binding="{Binding Path=Age, Mode=TwoWay, ValidatesOnExceptions=True}"
...
/>
请注意,奇怪的是(无论如何),异常将被捕获并显示在行标题中的感叹号。如果没有Mode=TwoWay
部分,您将不会使用红色边框,也不可能应用样式。
2)应用样式
另一个困难是在出现错误时设置样式,因为编辑元素将在您开始验证过程后立即关闭。所以附上一个样式:
<!-- Doesn't work -->
<DataGridTextColumn Binding="{Binding Path=Age, Mode=TwoWay, ValidatesOnExceptions=True}"
EditingElementStyle="{StaticResource datagridTBStyle}"
...
/>
如果您想触发验证错误,将无法正常工作。同样,CellStyle没有错误标志来触发。你必须使用一个技巧并声明一个FrameworkElement样式,如下所示:
<DataGridTextColumn Binding="{Binding Path=Age, Mode=TwoWay, ValidatesOnExceptions=True}"
ElementStyle="{StaticResource datagridElemStyle}"
...
/>
好消息是你可以在派生元素上定义样式,比如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>