2011-01-05 15 views
2

Ich verwende MVVM und mein Objekt implementieren IDataErrorInfo. Wenn eine Eigenschaft festgelegt ist, führe ich benutzerdefinierte Validierungsmethoden aus, und wenn die Überprüfung erfolgreich ist, gebe ich String.empty zurück, wodurch Validation.HasError auf false gesetzt wird. Wenn die Validierung fehlschlägt, wird Validation.HasError auf True festgelegt. Ich habe einen Stil, den ich für „erforderlichen Kontrollen“ verwenden (Kontrollen, die die Gültigkeitsprüfung durchführen) und stellen Sie ist die Quick-Info der Steuerung auf das, was der Fehler ist wie folgt:Validation.HasError wird nicht erneut ausgelöst, wenn ein neuer Fehler auftritt, während bereits true

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

Und die 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(); 
    } 
} 

Das Problem ist das: Der Benutzer gibt etwas ungültiges ... und der Validation.HasError wird auf True festgelegt. Der Tooltip wird so aktualisiert, wie er sollte. Wenn der Benutzer versucht, den Fehler zu korrigieren, aber einen Wert eingibt, der eine andere Art der Ungültigmachung verursacht, sollte die QuickInfo die neue Fehlerzeichenfolge anzeigen. Dies geschieht jedoch nicht. Der Fehler wird als der gleiche Fehler vom ersten Fehler angezeigt. Ich weiß, warum das passiert (denke ich) ... Weil der Trigger nicht ausgelöst wird, weil sich der Validation.HasError niemals von True -> False -> True ändert.

Hat jemand irgendwelche Erfahrung mit diesem oder einigen Ratschlägen, wie man den Auslöser erzwingt?

+0

Ich habe das gleiche Problem - haben Sie es geschafft, dies zu lösen? – pilsdumps

+0

Nein, nie. Immer noch nervt mich. – Thelonias

Antwort

3

Dies scheint die Antwort zu sein: IDataErrorInfo With Multiple Error Messages for a Property

Grundsätzlich Sie auf das aktuelle Element binden und eine Content verwenden, um die Fehler anzuzeigen. Es funktionierte für meinen Code.

+0

Ja, Sie haben Recht, der Vorschlag in meiner Antwort funktioniert nicht - Antwort gelöscht jetzt. – Slauma

+0

Ich benutze immer noch den ToolTip, aber ich benutze stattdessen das CurrentItem. Danke für die Information. – Thelonias

2

Ich glaube, ich habe das herausgefunden. Der Schuldige ist die Verwendung des Konverters. Ich war das gleiche Problem und das Problem Code-Schnipsel zu erleben war:

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

ich das Snippet zu ändern: aufgelöst

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

und wurde das Problem.

Fazit - Verwenden Sie keinen Konverter.

+0

Vielen Dank, dass Sie diese Lösung veröffentlicht haben. – alexandrudicu