INotifyDataErrorInfo ArgumentOutOfRangeException при создании события ErrorsChanged

Это очень странный, и в этот момент я думаю, что это может иметь какое-то отношение к моей конфигурации компьютеров.

В основном я создал довольно стандартную реализацию INotifyDataErrorInfo, и в некоторых случаях при создании события ErrorsChanged я получаю ArgumentOutOfRangeException. Это исключение не содержит много информации; он дает мне ArgumentOutOfRangeException crossed a native/managed boundary плюс стандартное описание ArgumentOutOfRangeException относительно неотрицательных индексов и размеров коллекции. Значение InnerException равно null. Трассировка стека выглядит следующим образом:

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)

Причина, по которой я упоминаю мою конфигурацию машины, заключается в том, что я попробовал пару решений, размещенных в блогах (например, здесь и здесь) и получить ту же проблему (т.е. не мой код, другую реализацию INotifyDataErrorInfo), и в комментариях других пользователей проблема не возникает. Googling включает несколько случайных хитов, которые не помогают.

Требуемое состояние:

  • Я ввел значение в элемент управления таким образом, чтобы была инициирована ошибка проверки. (Это отлично работает, текст ошибки отображается в пользовательском интерфейсе, как ожидалось).
  • Затем я вводим новое значение в элемент управления таким образом, чтобы проверка была успешной, и ошибки были удалены из коллекции ошибок (HasErrors возвращает false).
  • ErrorsChanged поднимается, чтобы отразить это изменение в успешной проверке без ошибок, и возникает исключение.

ОБНОВЛЕНИЕ: Я также могу воспроизвести, если я перемещаю фокус от текстового поля, отображающего ошибку проверки.

Мне кажется, что я пропустил пакет обновления/обновление или что-то еще, потому что из того, что я вижу, похоже, что это довольно элементарная ошибка в коде фреймворка и в то же время его не происходит для другие.

ОБНОВЛЕНИЕ: Я использую окончательную версию RTM Silverlight 4. НЕ RC или бета.

ОБНОВЛЕНИЕ: Я получаю тот же результат с официальным образцом MS, представленным этим документом.

ОБНОВЛЕНИЕ: Теперь я проверил свой код и упомянутые образцы на другом компьютере, и он отлично работает. Мне все равно хотелось бы разрешить это, так как его немного беспокоит, что он не работает на моей обычной машине (с которой у меня до сих пор не было никаких проблем). Любые предложения относительно того, как я мог бы отслеживать то, что вызывает это, будут оценены. Я повторно установил Silverlight (Runtime, SDK, Toolkit) на проблемную машину, и это не решило проблему.

UPDATE: Вот стек вызовов кода фреймворка, в котором происходит исключение, путем включения поддержки исходного сервера с сервером символов MS:

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 

ОБНОВЛЕНИЕ: Приложение работает нормально (на проблемной машине) без приложенного отладчика, работает как ожидалось, и не запускаются необработанные скрипты исключений (этот тип меня не впечатлил, может ли это быть связанным с ВС?). У меня был быстрый поиск в google, чтобы узнать, могу ли я найти файл журнала плагинов Silverlight, который может пролить свет здесь без везения, есть ли такой журнал?

Ответ 1

Я думаю, что это ошибка привязки в подсказке шаблона TextBox

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

Validation.Errors становятся пустыми, но привязка еще не обновила ссылки.

Я рекомендую игнорировать исключение. Снимите флажок "Перерыв, когда исключения пересекаются с AppDomain или управляются...." в настройках отладки.

Ответ 2

Мне удалось исправить эту проблему, удалив ссылки приложения Silverlight из веб-проекта и повторно добавив их.

Надеюсь, что это поможет.

Ответ 3

В этой ситуации есть два разных возможных исключения, которые выбрасываются из собственного кода. Ни один из них не пойман блоком try... catch, независимо от того, что вы помещаете (или не помещаете) в catch.

Один из них: "ArgumentOutOfRangeException пересек собственную/управляемую границу". Чтобы перестать видеть это, вам нужно снять флажок " Перерыв, когда исключения пересекаются с доменами AppDomain или управляемыми/родными (только для управляемого)" в "Инструменты" > "Параметры" > "Отладка" > "Общие".

Другой - это просто "ArgumentOutOfRangeException". Чтобы перестать видеть это, вам нужно проверить " Включить только мой код" в "Инструменты" > "Параметры" > "Отладка" > "Общие".