Ich habe den folgenden Ansatz genommen und es funktioniert. Grundsätzlich sollte das Modell Fehler korrekt aufzeichnen und sie in einem Wörterbuch auflisten lassen, selbst wenn das Objekt gerade instanziiert wird und der Benutzer noch keinen Text eingegeben hat. Daher habe ich meinen Modellcode oder den IDataErrorInfo-Validierungscode nicht geändert. Stattdessen setze ich die Validation.Error Template-Eigenschaft zunächst auf {x: Null}. Dann gibt es Code, um das LostFocus-Ereignis der TextBox zu verkabeln, das die Validation.Error-Vorlage zurück zu dem, was ich verwende, ändert. Um das Austauschen von Vorlagen und das Hinzufügen des LostFocus-Ereignishandlers zu allen TextBoxen in meiner Anwendung zu erreichen, verwendete ich einige Abhängigkeitseigenschaften. Hier ist der Code, den ich benutzt habe.
Abhängigkeitseigenschaften und Lost-Focus-Code:
public static DependencyProperty IsDirtyEnabledProperty = DependencyProperty.RegisterAttached("IsDirtyEnabled",
typeof(bool), typeof(TextBoxExtensions), new PropertyMetadata(false, OnIsDirtyEnabledChanged));
public static bool GetIsDirtyEnabled(TextBox target) {return (bool)target.GetValue(IsDirtyEnabledProperty);}
public static void SetIsDirtyEnabled(TextBox target, bool value) {target.SetValue(IsDirtyEnabledProperty, value);}
public static DependencyProperty ShowErrorTemplateProperty = DependencyProperty.RegisterAttached("ShowErrorTemplate",
typeof(bool), typeof(TextBoxExtensions), new PropertyMetadata(false));
public static bool GetShowErrorTemplate(TextBox target) { return (bool)target.GetValue(ShowErrorTemplateProperty); }
public static void SetShowErrorTemplate(TextBox target, bool value) { target.SetValue(ShowErrorTemplateProperty, value); }
private static void OnIsDirtyEnabledChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args) {
TextBox textBox = (TextBox)dependencyObject;
if (textBox != null) {
textBox.LostFocus += (s, e) => {
if ((bool) textBox.GetValue(ShowErrorTemplateProperty) == false) {
textBox.SetValue(ShowErrorTemplateProperty, true);
}
};
}
}
Wenn IsDirtyEnabled Abhängigkeitseigenschaft auf true gesetzt ist, verwendet er den Rückruf der Textbox des Lost-Focus-Ereignis zu einem Handler zu befestigen. Der Handler ändert nur die angefügte Eigenschaft ShowErrorTemplate auf true, was wiederum im Stil-Trigger des Textfelds auslöst, die Validation.Error-Vorlage anzuzeigen, wenn die TextBox den Fokus verliert.
TextBox Styles:
<Style TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate" Value="{StaticResource ValidationErrorTemplate}"/>
<Setter Property="gs:TextBoxExtensions.IsDirtyEnabled" Value="True" />
<Style.Triggers>
<Trigger Property="gs:TextBoxExtensions.ShowErrorTemplate" Value="false">
<Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/>
</Trigger>
</Style.Triggers>
</Style>
Auch dies mag für eine einfache Sache des Codes viel, aber dann habe ich es für alle Textfelder Ich verwende nur einmal zu tun.
grüße, Nirvan.
Siehe diese Frage: http://stackoverflow.com/questions/1502263/how-to-suppress-validation-when-nothing-is-tered –
@AlexKofman markieren diese Frage als duplicate. Ich habe es schon gemacht. – MikroDel