2009-12-16 7 views
1

J'essaie d'utiliser la validation d'exception sur une cellule dans un DataGrid avec un style dans EditingElementStyle de DataGridTextColumn pour définir une info-bulle avec le contenu de l'erreur. L'erreur se produit mais n'est pas interceptée ou affichée dans WPF.Erreur de validation de DataGrid WPF non interceptée

Le code et l'exception sont indiqués ci-dessous. Quelqu'un peut-il me dire ce dont j'ai besoin pour résoudre ce problème?

Cheers,
Berryl

est ici l'exception:

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. 

Voici le XAML pour la DataGridTextColumn:

<dg:DataGridTextColumn 
    ....     
    EditingElementStyle="{StaticResource cellEditStyle}" 
    Binding="{Binding Allocations[6].Amount, Converter={StaticResource amtConv}, 
     ValidatesOnExceptions=True}" 
           /> 

Et le style est ici qui devrait fournir une rétroaction infobulle erreur:

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

Répondre

5

Il est probablement un peu en retard, mais comme je suis confronté au même genre de problèmes, voici une solution de rechange pour vous aider à le consulter (testé avec .NET 4.0.30319).

1) Prendre l'exception

Alors que le code de liaison suivant dans le message original fonctionne très bien avec une zone de texte, par exemple, il n'a pas avec une cellule de texte DataGrid (même si les États documents Msn si):

<!-- Doesn't work --> 
<DataGridTextColumn Binding="{Binding Path=Age, ValidatesOnExceptions=True}" 
        ... 
        /> 

Vous devez ajouter ce bit:

<DataGridTextColumn Binding="{Binding Path=Age, Mode=TwoWay, ValidatesOnExceptions=True}" 
        ... 
        /> 

Notez que, curieusement (à moi de toute façon), l'exception sera captée et affichée avec le point d'exclamation dans l'en-tête de ligne. Vous n'aurez pas la bordure rouge ni la possibilité d'appliquer un style sans la pièce Mode=TwoWay.

2) Application d'un style

Une autre difficulté est mise un style en cas d'erreur, parce que l'élément d'édition fermera dès que vous commencez le processus de validation. Ainsi, la fixation d'un style avec:

<!-- Doesn't work --> 
<DataGridTextColumn Binding="{Binding Path=Age, Mode=TwoWay, ValidatesOnExceptions=True}" 
        EditingElementStyle="{StaticResource datagridTBStyle}" 
        ... 
        /> 

ne marchera pas si vous voulez déclencher une erreur de validation. De même avec un CellStyle qui n'aura pas l'indicateur d'erreur à déclencher. Vous devez utiliser une astuce et de déclarer un style FrameworkElement, comme ceci:

<DataGridTextColumn Binding="{Binding Path=Age, Mode=TwoWay, ValidatesOnExceptions=True}" 
        ElementStyle="{StaticResource datagridElemStyle}" 
        ... 
        /> 

bonnes nouvelles est que vous pouvez définir le style sur un élément dérivé, comme un TextBlock, et bénéficier de leurs propriétés:

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