He seguido el siguiente enfoque y funciona. Básicamente, el Modelo debería registrar correctamente los errores y hacer que se enumeren en un diccionario, incluso si el objeto se acaba de crear una instancia y el Usuario aún no ha ingresado ningún Texto. Así que no cambié mi código de modelo o el código de validación IDataErrorInfo. En cambio, acabo de establecer la propiedad Validation.Error Template en {x: Null} inicialmente. Luego hay un código para cablear el evento LostFocus de TextBox que cambia la plantilla Validation.Error a lo que estoy usando. Para lograr el intercambio de plantillas y unir el controlador de eventos LostFocus a todos los TextBox en mi aplicación, utilicé un par de propiedades de dependencia. Aquí está el código que he usado.
propiedades de dependencia y LostFocus Código:
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);
}
};
}
}
Si IsDirtyEnabled propiedad de dependencia se establece en true, se utiliza la devolución de llamada para unir evento LostFocus del cuadro de texto a un controlador. El manejador simplemente cambia la propiedad adjunta ShowErrorTemplate a true, que a su vez activa el desencadenante de estilo de la caja de texto para mostrar la plantilla Validation.Error, cuando el TextBox pierde el foco.
Estilos
caja de texto:
<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>
Esto puede parecer demasiado de código para una cosa simple, pero entonces tengo que hacerlo sólo una vez para todos los cuadros de texto que estoy utilizando.
respetos, Nirvan.
Consulte esta pregunta: http://stackoverflow.com/questions/1502263/how-to-suppress-validation-when-nothing-is- inscrito –
@AlexKofman marque esta pregunta como duplicar. Ya lo he hecho. – MikroDel