2012-04-17 16 views
12

Estoy intentando validar mi clase de modelo usando IDataErrorInfo como se indica a continuación.IDataErrorInfo - Inicialmente ignore los errores cuando se carga la vista por primera vez

//Validators 
public string this[string propertyName] { 
    get { 
     string error = null; 

     if (propertyName == "Name") { 
      error = ValidateName(); 
     } 
     return error; 
    } 
} 

Esto funciona bien, excepto que cuando la vista se carga por primera vez ya contiene errores de validación. ¿Es posible ignorar/suprimir los errores de validación cuando la vista se carga por primera vez? Además, es una práctica común mostrar errores cuando se carga la vista y antes de que el usuario inicie la entrada de datos para las propiedades del modelo.

respetos, Nirvan.

Editar: Así es como estoy configurando IDataErrorInfo.

<TextBox Text="{Binding Name, ValidatesOnDataErrors=True}" Grid.Row="1" Grid.Column="1" /> 
+4

Consulte esta pregunta: http://stackoverflow.com/questions/1502263/how-to-suppress-validation-when-nothing-is- inscrito –

+0

@AlexKofman marque esta pregunta como duplicar. Ya lo he hecho. – MikroDel

Respuesta

3

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.

+0

La solución de Nirvan hace el truco, si mueves este código a una clase base (BaseControll por ejemplo) entonces puedes derivar todos tus controles de esta clase base y tener este comportamiento en todos tus controles. –

+0

Sé que ha pasado un tiempo, pero estoy enfrentando el mismo problema. Su solución funciona perfectamente, mi pregunta es si el mensaje de error de validación es el mismo para todos los campos: la plantilla de error apunta a un recurso estático. ¡Gracias! – thor2k

1

¿Estás lanzando la excepción en el conseguir?

public string Name 
{ 
    get { return _name; } 
    set 
    { 
     _name = value; 
     if (String.IsNullOrEmpty(value)) 
     { 
      throw new ApplicationException("Customer name is mandatory."); 
     } 
    } 
} 
+0

No, no estoy lanzando ninguna excepción. Estoy usando la interfaz IDataErrorInfo para validar las propiedades del modelo. – Jatin

+0

Mi recuerdo es que tuve que usar ValidationRules para obtener la verificación de errores solo en el conjunto. Lo siento, no tengo acceso a ese código en este momento. – Paparazzi

+0

Gracias por su esfuerzo de todos modos. – Jatin

1

establece las reglas en su método ValidateName(). su vista solo muestra el error :) sugiero que el nombre es un campo obligatorio y debe ser llenado por el usuario pero no le gusta el borde rojo cuando la vista se carga por primera vez?

uso dos plantillas diferentes de control para validation.errortemplate la normal y una para los campos obligatorios (*) Un rojo

thats la forma en que lo hice la última vez.

+0

Eso ciertamente escondería el error en la vista y podría ser una posible solución. Sin embargo, aún esperaré algún tiempo en caso de que haya una solución mejor que esta. Gracias – Jatin

2

intente establecer el contexto de datos DESPUÉS de que se haya mostrado la vista.

En mi caso, esto ayudó.

Cuestiones relacionadas