Cuyo caso se debe utilizar para actualizar un modelo de cuadro de texto (LostFocus, LostKeyboardFocus, etc) en WPF? Cómo establecer la prioridad de los acontecimientos en WPF?

StackOverflow https://stackoverflow.com/questions/4447645

Pregunta

Tengo una aplicación en la que hay gran cantidad de cuadros de texto y algunos botones como Guardar, Guardar como, etc.
Cuando el usuario edita un cuadro de texto, tengo que comprobar la base de datos para algún rango, validar el rango y actualizar la base de datos. Si hay algún error en valor introducido por el usuario, entonces no debería permitir que el cuadro de texto a perder el foco.

Yo estaba usando evento LostFocus para esto y que funcionaba bien hasta hace poco he descubierto un error en mi solicitud.

Error: El usuario edita un valor en el cuadro de texto y luego hace clic en el botón Guardar; el evento LostFocus no se llama por lo que la base de datos no está siendo actualizado: (

Ahora mi pregunta es qué evento se debe utilizar en el cuadro de texto para actualizar la base de datos. Probé evento TextChanged pero valida para cada carácter y hacer mi solicitud lenta. Estoy confundido en seleccionando el evento adecuado para este tipo de aplicación!

Nota: :! ** Los botones son diferentes en control de usuario

EDIT 1: Tengo algunos comandos unidos para hacer clic en los botones, estos comandos están siendo ejecutados antes LostFocus !! ¿Puedo establecer precedencia o algo así como comportamientos o comandos adjuntos debería ponerse ejecutado tras LostFocus !!

EDIT 2: Estaba Depuración de la aplicación mediante la desactivación de algunos comandos, lo que encontré fue en algunos casos, el DelegateCommand es ejecutado antes de LostFocus, por lo que quiero evitar eso. ¿Cómo puedo hacerlo? Me sentí durante el desarrollo es imposible developa aplicación MVVM pura, así que estoy tipo de uso de un poco de código subyacente!

¿Fue útil?

Solución

La captura el foco del teclado dentro de un control es generalmente un signo de un mal diseño de la interfaz de usuario -. Que es bastante fácil de hostil para obligar al usuario a los datos fijos en un control antes de que pueda escribir en cualquier otro lugar en la interfaz de usuario

Dicho esto, no deberías estar usando eventos en todos aquí. Usted está tratando de escribir una aplicación de Windows Forms en WPF. Usted debe escribir una aplicación de WPF.

Crear una clase que es un modelo lógico de la vista - es decir, hay una propiedad string del cuadro de texto y una propiedad Command (o, más probablemente, un RelayCommand) para el botón Guardar. Enlazar el cuadro de texto a la propiedad de cadena, por ejemplo:.

<TextBox Text="{Binding MyTextProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

Debido a que el UpdateSourceTrigger es PropertyChanged, el objeto de origen se actualizarán cada vez que el usuario escribe un carácter.

Enlazar el botón a la propiedad de comandos, por ejemplo:.

<Button CommandBinding="{Binding SaveCommand}">Save</Button>

implementar los métodos CanSave y Save apropiada, que la RelayCommand (como se describe en Josh Smith de artículo esencial en el patrón MVVM) requiere, para que el botón se activa cuando la propiedad de cadena es válida y desactivado cuando no lo es.

Otros consejos

Creo que el mejor enfoque es la prevención de un usuario a proceder hasta que toda la información válida se ha recopilado.

Al igual que un asistente de instalación con Terms & Conditions Dialog y el botón Next. Hasta que no marca la casilla I Agree, Next botón está desactivado.

De esta manera, usted no tiene que preocuparse por procedimiento usuario sin proporcionar información válida. De esta manera, se puede usar cualquier evento en TextBox para validar sus datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top