Podjęłam następujące podejście i działa. Zasadniczo Model powinien poprawnie rejestrować błędy i mieć je wymienione w słowniku, nawet jeśli obiekt jest właśnie utworzony, a użytkownik nie wprowadził jeszcze żadnego tekstu. Tak więc nie zmieniłem kodu modelu ani kodu sprawdzania IDataErrorInfo. Zamiast tego najpierw ustawiam właściwość Validation.Error Template na wartość początkową {x: Null}. Następnie jest kod do podłączenia zdarzenia LostFocus w TextBox, który zmienia szablon Validation.Error z powrotem na to, czego używam. Aby uzyskać zamianę szablonów i dołączenie obsługi zdarzeń LostFocus do wszystkich aplikacji TextBox w mojej aplikacji, użyłem kilku właściwości zależności. Oto kod, którego użyłem.
Zależność Właściwości i LostFocus Kod:
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);
}
};
}
}
Jeśli IsDirtyEnabled właściwość zależność jest ustawiony na true, używa zwrotnego dołączyć zdarzenie polu tekstowym za LostFocus do obsługi. Handler po prostu zmienia właściwość dołączoną ShowErrorTemplate na wartość true, co z kolei powoduje, że w wyzwalaczu stylu pola tekstowego pojawia się szablon Validation.Error, gdy pole TextBox traci ostrość.
TextBox Style:
<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>
To może wydawać się zbyt dużo kodu dla prostych rzeczy, ale potem trzeba to zrobić tylko raz dla wszystkich pól tekstowych używam.
pozdrowienia, Nirvan.
Zobacz to pytanie: http://stackoverflow.com/questions/1502263/how-to-suppress-validation-when-nothing-is-entered –
@AlexKofman zaznacz to pytanie jako duplikat. Już to zrobiłem. – MikroDel