2009-12-16 46 views
1

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

代码和例外如下所示。有人能告诉我我需要解决这个问题吗?

干杯,
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}" 
           /> 

这里是应该提供工具提示反馈风格他错误:

<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> 

回答

5

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

1)捕捉异常

而在原来的职位以下的绑定代码工作正常与一个文本框,例如,它不与一个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>