Это очень странный, и в этот момент я думаю, что это может иметь какое-то отношение к моей конфигурации компьютеров.
В основном я создал довольно стандартную реализацию 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, который может пролить свет здесь без везения, есть ли такой журнал?