11

Esto es extraño y en este momento estoy pensando que puede tener algo que ver con la configuración de mi máquina.INotifyDataErrorInfo ArgumentOutOfRangeException al generar el evento ErrorsChanged

Básicamente he creado una implementación bastante estándar de INotifyDataErrorInfo y, en ciertas circunstancias, al generar el evento ErrorsChanged obtengo un ArgumentOutOfRangeException. Esta excepción no contiene mucha información; me da ArgumentOutOfRangeException crossed a native/managed boundary más la descripción estándar ArgumentOutOfRangeException con respecto a índices no negativos y tamaños de colección. El InnerException es nulo. El seguimiento de la pila es el siguiente:

at System.ThrowHelper 
     .ThrowArgumentOutOfRangeException(ExceptionArgument argument, 
              ExceptionResource resource) 
at System.ThrowHelper.ThrowArgumentOutOfRangeException() 
at System.Collections.Generic.List`1.get_Item(Int32 index) 
at System.Collections.ObjectModel.Collection`1.get_Item(Int32 index) 
at System.Collections.ObjectModel.ReadOnlyCollection`1.get_Item(Int32 index) 

La razón que menciono mi configuración de la máquina se debe a que he intentado un par de soluciones publicado a los blogs (por ejemplo here y here) y obtener el mismo problema (es decir, no mi código, otra implementación de INotifyDataErrorInfo) y no hay mención en los comentarios de ningún otro que tenga el problema que tengo. Google busca un par de hits aleatorios que no ayudan.

El estado requerido es el siguiente:

  1. que han entrado en un valor en el control de manera que se desencadena un error de validación. (Esto funciona bien, el texto de error se muestra en la interfaz de usuario como se esperaba).
  2. Ingreso un nuevo valor en el control para que la validación tenga éxito y los errores se eliminen de la colección de errores (HasErrors devuelve falso).
  3. Se modificó ErrorsChanged para reflejar este cambio en una validación exitosa sin errores, y se produce la excepción.

ACTUALIZACIÓN: también puedo reproducir si muevo el foco lejos de un cuadro de texto que muestra un error de validación.

Me pregunto si me he perdido un service pack/update o algo así porque, por lo que veo, parece que hay un error bastante elemental en el código de framework y al mismo tiempo no está sucediendo para otros.

ACTUALIZACIÓN: Estoy utilizando la versión RTM final de Silverlight 4. NO es un RC o Beta.

ACTUALIZACIÓN: puedo obtener el mismo resultado con la muestra oficial de MS provisto con this whitepaper.

ACTUALIZACIÓN: Ahora he probado mi código y las muestras mencionadas en otra máquina y funciona bien. Realmente me gustaría resolver esto, ya que es un poco inquietante que no esté funcionando en mi máquina normal (que no he tenido ningún problema hasta ahora). Cualquier sugerencia sobre cómo podría rastrear qué está causando esto sería apreciada. He vuelto a instalar Silverlight (Runtime, SDK, Toolkit) en la máquina problema y esto no ha resuelto el problema.

UPDATE: Aquí es la pila de llamadas del código marco donde la excepción se está produciendo obtiene por habilitar el soporte de servidor de origen con MS servidor de símbolos:

mscorlib.dll!System.ThrowHelper.ThrowArgumentOutOfRangeException(System.ExceptionArgument argument, System.ExceptionResource resource) + 0x40 bytes 
    mscorlib.dll!System.ThrowHelper.ThrowArgumentOutOfRangeException() + 0x10 bytes 
    mscorlib.dll!System.Collections.Generic.List<System.Windows.Controls.ValidationError>.this[int].get(int index = 0) + 0x13 bytes 
    mscorlib.dll!System.Collections.ObjectModel.Collection<System.Windows.Controls.ValidationError>.this[int].get(int index) + 0x2e bytes 
    mscorlib.dll!System.Collections.ObjectModel.ReadOnlyCollection<System.Windows.Controls.ValidationError>.this[int].get(int index) + 0x2e bytes 
    [Native to Managed Transition] 
    [Managed to Native Transition] 
    System.Windows.dll!System.Windows.IndexerListener.Value.get() + 0xc3 bytes 
    System.Windows.dll!System.Windows.IndexerPathStep.Value.get() + 0x17 bytes 
    System.Windows.dll!System.Windows.PropertyPathListener.RaisePropertyPathStepChanged(System.Windows.PropertyPathStep source = {System.Windows.IndexerPathStep}) + 0x17 bytes 
    System.Windows.dll!System.Windows.IndexerPathStep.RaisePropertyPathStepChanged(System.Windows.PropertyListener source) + 0xe bytes 
    System.Windows.dll!System.Windows.IndexerListener.SourcePropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs args) + 0xea bytes 
    System.Windows.dll!System.Windows.Data.WeakPropertyChangedListener.PropertyChangedCallback(object sender, System.ComponentModel.PropertyChangedEventArgs args) + 0x3d bytes 
    System.Windows.dll!System.Collections.ObjectModel.ReadOnlyObservableCollection<System.__Canon>.OnPropertyChanged(System.ComponentModel.PropertyChangedEventArgs args) + 0x17 bytes 
    System.Windows.dll!System.Collections.ObjectModel.ReadOnlyObservableCollection<System.__Canon>.HandlePropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + 0xe bytes 
    System.Windows.dll!System.Collections.ObjectModel.ObservableCollection<System.Windows.Controls.ValidationError>.OnPropertyChanged(System.ComponentModel.PropertyChangedEventArgs e) + 0x37 bytes 
    System.Windows.dll!System.Collections.ObjectModel.ObservableCollection<System.Windows.Controls.ValidationError>.RemoveItem(int index = 0) + 0x79 bytes 
    mscorlib.dll!System.Collections.ObjectModel.Collection<System.Windows.Controls.ValidationError>.Remove(System.Windows.Controls.ValidationError item) + 0x75 bytes 
    System.Windows.dll!System.Windows.Controls.Validation.RemoveValidationError(System.Windows.FrameworkElement fe = {System.Windows.Controls.TextBox}, System.Windows.Controls.ValidationError error) + 0x40 bytes 
    System.Windows.dll!System.Windows.Data.BindingExpression.RemoveErrorFromTarget(System.Windows.Controls.ValidationError error) + 0x48 bytes 
    System.Windows.dll!System.Windows.Data.BindingExpression.NotifyOldDataErrorInfos(System.Collections.ObjectModel.Collection<System.Windows.Controls.ValidationError> validationErrors) + 0x73 bytes 
    System.Windows.dll!System.Windows.Data.BindingExpression.NotifyOldDataErrorInfos(bool isNotifyChildDataErrorInfo) + 0x25 bytes 
    System.Windows.dll!System.Windows.Data.BindingExpression.NotifyDataErrorInfo_ErrorsChanged(object sender, System.ComponentModel.DataErrorsChangedEventArgs e) + 0xad bytes 

UPDATE: La aplicación se ejecuta bien (en la máquina del problema) sin un depurador conectado, funciona como se esperaba y no se invocan guiones de excepción no controlados (Esto me dejó perplejo, ¿podría estar relacionado con VS?). Hice una búsqueda rápida en Google para ver si podía encontrar algún archivo de registro de complemento de Silverlight que pudiera arrojar algo de luz aquí sin suerte, ¿existe tal registro?

+0

Tengo el mismo error con SL5 en VS2012 –

+0

¿Alguna vez encontró una respuesta? Estoy teniendo problemas similares sin Silverlight http://stackoverflow.com/questions/15824070/datepicker-value-set-error-binding-to-datasource –

+0

@kirsten No lo siento, no he encontrado una solución. Solo se pudo reproducir en esa caja con un depurador adjunto, por lo que nunca se encontró lo que era. –

Respuesta

0

Pude solucionar este problema quitando los enlaces de la aplicación Silverlight del proyecto web y volviéndolos a agregar.

Espero que esto ayude.

+1

desafortunadamente eso no ayudó, gracias de todos modos. –

+0

Lamento escuchar eso. Lo extraño es que no revisé los cambios, en cambio experimenté deshaciendo los cambios pendientes en el proyecto web y reconstruyendo con los archivos originales, para mi sorpresa el problema no volvió a aparecer. También desmarqué (luego volví a verificar) la opción de depuración en el proyecto web y lo mismo con los enlaces de RIA a los proyectos en el proceso de resolución. Cada vez que hice una reconstrucción de toda la solución. Es extraño, ya que solo encuentro este error en máquinas con nuevas instalaciones. – Chooksii

3

Creo que es el error en el cuadro de texto vinculante plantilla de información sobre herramientas

{Binding (Validation.Errors)[0].ErrorContent} 

Validation.Errors se vacían pero la unión todavía no ha actualizado sus referencias.

Recomiendo ignorar la excepción. Desmarque "Interrumpir cuando las excepciones cruzan AppDomain o administrado ...." en Configuración de depuración.

+0

Lo probé en mi computadora y funciona como un encanto. Estaba un poco escéptico sobre si esto podría causar otros problemas en otro tipo de excepciones, pero revisé otras 3 instalaciones de VS 2010 en mis compañeros de trabajo y todos tenían esta opción desactivada por defecto. Así que supongo que esta es la forma correcta de resolver este problema. – Entrodus

+0

Lo probé y no funcionó. – Shimmy

0

Existen dos posibles excepciones diferentes que se obtienen del código nativo en esta situación. Ninguno es atrapado por un intento ... atrapar bloque, no importa lo que pongas (o no pongas) en la trampa.

Uno es "ArgumentOutOfRangeException cruzó un límite nativo/administrado". Para dejar de ver este, debe desmarcar "Salto cuando las excepciones se cruzan con Dominio de aplicación o límites administrados/nativos (Administrado solamente)" en Herramientas> Opciones> Depuración> General.

El otro es simplemente "ArgumentOutOfRangeException". Para dejar de ver esto, debe marcar "Habilitar solo mi código" en Herramientas> Opciones> Depuración> General.

Cuestiones relacionadas