Validation.HasError ne déclenche pas à nouveau si une nouvelle erreur vient alors qu'il était déjà vrai

StackOverflow https://stackoverflow.com/questions/4606509

Question

J'utilise MVVM et mon objet de mettre en œuvre IDataErrorInfo. Lorsqu'une propriété est définie, je lance des méthodes de validation personnalisées et si la validation passe, je reviens String.Empty, qui met Validation.HasError à false. Si la validation échoue, Validation.HasError est définie sur true. J'ai un style que j'utilise pour « contrôles nécessaires » (contrôles qui effectueront la validation) et définir est le infobulle du contrôle à ce que l'erreur est comme ceci:

<Style x:Key="RequiredControl" TargetType="{x:Type Control}" >
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip" Value="{Binding (Validation.Errors), Converter={StaticResource ErrorConverter}, RelativeSource={x:Static RelativeSource.Self}}"/>
        </Trigger>
    </Style.Triggers>
</Style>

Et le ErrorConverter:

public class ZynErrorContentConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var errors = value as ReadOnlyObservableCollection<ValidationError>;
        if (errors == null) return "";

        return errors.Count > 0 ? errors[0].ErrorContent : "";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Le problème est le suivant: L'utilisateur entre quelque chose d'invalide ... et le Validation.HasError est défini sur true. Les mises à jour des infobulles comme il est censé. Si l'utilisateur tente de corriger l'erreur, mais entre une valeur qui provoque un type de différent infirmation, l'info-bulle doit afficher la nouvelle chaîne d'erreur, mais cela ne se produit pas. L'erreur montre que la même erreur de la première erreur. Je sais pourquoi cela arrive (je pense) ... Parce que le déclenchement ne se déclenche pas parce que les changements Validation.HasError jamais de True -> Faux -.> True

Quelqu'un at-il une expérience avec ce ou des conseils quant à la façon de forcer le déclencheur?

Était-ce utile?

La solution

Cela semble être la réponse: IDataErrorInfo Avec plusieurs messages d'erreur pour une propriété

En fait, vous liez à l'élément en cours et utilisez un ContentPresenter pour afficher l'erreur. Il a travaillé pour mon code.

Autres conseils

Je crois avoir compris cela. Le coupable est l'utilisation du convertisseur. Je ressentais la même question et l'extrait de code de problème était:

<Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self}, 
                        Path=(Validation.Errors), 
                        Converter={StaticResource validationErrorsToStringConverter }}"/>

Je change l'extrait à:

<Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
        Path=(Validation.Errors)[0].ErrorContent}"/>

et le problème a été résolu.

Conclusion. - Ne pas utiliser un convertisseur

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top