2011-09-02 10 views
6

En mi aplicación basada en MVVM necesito validar los campos en una entrada de datos desde. Si es posible, me gustaría utilizar el enlace de validación WPF estándar con ErrorTemplates.validación de campo determinista y asíncrona en WPF

Sin embargo, me gustaría que la ejecución de la lógica de validación para estar completamente expulsados ​​/ provocada por el modelo de vista (empuje a la vista, no se tire por la vista) por las siguientes razones:

  1. Debe funcionar de forma asíncrona porque la lógica de validación puede tardar un tiempo en ejecutarse.
  2. que tienen que ser más determinista y de grano fino cuando la lógica de validación se va a ejecutar (por ejemplo, sólo después de que el usuario haga clic en "Aplicar" o cuando el estado interno cambia de manera que las entradas de repente dejan de ser válidas)

Sé que Silverlight tiene INotifyDataErrorInfo que se introdujo exactamente para este propósito, pero WPF no. ¿Cómo puedo seguir ejecutando mi lógica de validación de manera determinista y asíncrona?

+0

Parece que simplemente no es posible, así que tengo que ir a una ruta diferente como se describe aquí: http://stackoverflow.com/questions/7293277/create-a-visualtree-off-of -a-control-template-in-code – bitbonk

+0

Tenga en cuenta que WPF 4.5 introdujo un soporte similar a Silverlight para INotifyDataErrorInfo, aquí por ejemplo: http://anthymecaillard.wordpress.com/2012/03/26/wpf-4-5-validation -asynchrone/ – GrahamMc

Respuesta

0

La validación incorporada para WPF y Silverlight está diseñada para la validación rápida del lado del cliente (como Regex, valores de análisis, etc.).

Si necesita ir a un servidor para realizar la validación (o la validación lleva mucho tiempo), lo haría de forma personalizada. Por ejemplo, cuando hace clic en un botón de guardar, etc.

Así que usted tiene un método Save en un modelo de vista (que no menciona qué marco se utiliza MVVM):

public void Save() 
{ 
    //Do your validation, this might start a new thread (I use Async CTP myself) 

    //If validation is good, do your extra work, else display validation errors 
} 

me acaba de hacer todo el trabajo requerido para esto dentro de una acción en su ViewModel

+0

Entonces, ¿está diciendo que no puedo usar el ErrorTemplates? Necesito confiar en que construyó plantillas de error de WPF y controles personalizados. p.ej. Me gustaría mostrar el borde rojo estándar alrededor de un cuadro de texto no válido. ¿Cómo puedo forzar que se muestre este borde? – bitbonk

+0

Sugería utilizar un método como la respuesta superior sugiere aquí: http://stackoverflow.com/questions/921601/how-can-i-handle-a-validation-error-in-my-viewmodel-instead-of -my-views-code-beh. No creo que sea una buena idea utilizar la validación incorporada si va a ser una operación de larga ejecución (siempre bloqueará la IU). – jonathanpeppers

+0

Todavía necesito materializar algún tipo de "ErrorTemplate" y mostrarlo una vez que la máquina virtual plantea un evento. Como desafortunadamente algunos de mis formularios tienen muchos campos, no me gustaría que los elementos visuales de error formen parte del árbol visual de inmediato, sino que solo deberían crearse (por ejemplo, mediante un comportamiento) una vez que se produjo un error de validación para ese campo: Ver más información en mi pregunta de seguimiento: http://stackoverflow.com/questions/7293277/create-a-visualtree-off-of-a-control-template-in-code – bitbonk

Cuestiones relacionadas