2010-01-15 11 views
20

Estoy en el proceso de aprender WPF, y estoy desconcertado por el hecho de que las excepciones de enlace de datos no causan una excepción de tiempo de ejecución/no controlada.¿Por qué WPF traga las excepciones de enlace de datos?

¿Alguien puede explicar los beneficios del enlace de datos trabajando de esta manera? Supongo que hay son beneficios, pero hasta ahora no veo ninguno (descargo de responsabilidad: recién estoy comenzando con el enlace de datos).

Los enlaces a recursos que explican los motivos teóricos (o prácticos) para tomar esta decisión también funcionarían.

+1

Dupe: http://stackoverflow.com/questions/978887/why- does-wpf-databinding-swallow-exceptions –

+1

No es una tontería. Esta pregunta se trata de por qué, la pregunta vinculada es sobre qué hacer al respecto. –

+0

La primera respuesta en la pregunta vinculada explica qué hacer al respecto. Fuente de seguimiento personalizada ftw. –

Respuesta

9

Pongo Lo sé con certeza, pero sospecho que es porque no hay ningún lugar para manejar la excepción.

Supongamos que tiene algo cuyas propiedades desea vincular, pero a veces ese algo es nulo. (Por ejemplo, {Binding Name.Length}, donde Nombre es una propiedad de cadena que podría ser nula.) En este caso, está contento de que esto no sea operativo, porque sabe que el control nunca se mostrará cuando el Nombre sea nulo (debido a un desencadenante decir) o porque usted sabe que esto será una condición transitoria mientras la fuente de enlace está cargando sus datos.

Supongamos ahora que WPF propagó NullReferenceException al intentar llamar a Length en la cadena de nombre nulo. En el código de procedimiento, captas esta excepción y la tragas porque sabías que era benigna. Pero no puede colocar un controlador de excepción alrededor del código de enlace de WPF. Se llama desde algún lugar dentro de WPF. Así que la excepción se extendería hasta Application.Run, que no es un lugar muy útil para atraparla.

Así que en lugar de obligarlo a centralizar sus controladores de excepciones vinculantes en Application.Run, creo que los chicos de WPF decidieron tragarse las excepciones. Sólo una teoría ...

+1

I ' No estoy seguro de estar de acuerdo con esto. Técnicamente, el elemento 'Binding' solo tiene una ruta de cadena que luego se convierte en una instancia' PropertyPath'. Esto, a su vez, se usaría para navegar hasta la propiedad de destino. probablemente tenga sentido que este navegador verifique nulo en cada paso del camino y lo devuelva cada vez que se cumpla; lo que sigue siendo altamente cuestionable es cómo maneja las excepciones * reales * lanzadas por los compradores de propiedades que reciben visitas. Eso, en mi humilde opinión, es una receta para la catástrofe. – Crono

4

No sé por qué ese es el comportamiento predeterminado, pero hay formas de evitarlo.

Por ejemplo, aunque no le informará sobre el error de enlace, la ventana de Salida lo hará. Puede captar eso usando validación de enlace también.

EDIT: He encontrado this artículo que tiene una muy buena idea para crear casos de prueba que va a atrapar a los errores de enlace silenciosas molestos (y me encantó la foto en la parte superior del artículo)

+0

De hecho, puede ver la excepción de enlace en la ventana de salida en tiempo de ejecución. ¿Sabe si también puede conocer las excepciones que ocurren en tiempo de diseño (es decir, en la mezcla)? –

+0

Enlace no válido – Neil

5

Yo diría que es porque el costo de producir una excepción es prohibitivo. La implementación actual funciona incluso en el caso de que haya enlaces no válidos y en forma actual que realmente puedan tener un efecto muy significativo en el rendimiento. Tome este ejemplo, cree un DataGrid que no sea vinculante y esto cargue 1.000 registros en él. Mida el rendimiento con todas las fijaciones correctas y nuevamente con una de ellas incorrecta. La diferencia es considerable. Agregue las instancias de la clase de excepción de pie y podría salir mal del control. Solo es mi opinión.

+0

¡Pensamiento interesante! No había considerado la cuestión del rendimiento de capturar y manejar la excepción para cada elemento de un control de lista ... – itowlson

+0

Bah, quería votar esto por alto, pero accidentalmente "desactivé" el voto alternativo y ahora no puedo volver a hacer clic en él para restaurar mi upvote. Lo siento, Keith - virtual +1 de todos modos! – itowlson

+0

el enlace con enlaces erróneos es lento debido al mensaje de advertencia que se muestra en la ventana de salida en Visual Studio; La ventana de salida es muy lenta –

0

Aquí es un enlace a un blog post donde el blogger escribe acerca de un caso en el que argumenta que no tiene sentido que los errores son vinculantes silencio

Cuestiones relacionadas