INotifyDataErrorInfo ArgumentOutOfRangeException при возникновении события ErrorsChanged - PullRequest
11 голосов
/ 04 октября 2010

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

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

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), и в комментариях нет упоминаний о других проблемах, с которыми я сталкиваюсь.При поиске в Google появляется пара случайных попаданий, которые не помогают.

Требуется следующее состояние:

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

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

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

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

ОБНОВЛЕНИЕ: Я получаю тот же результат с официальным образцом 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 

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

Ответы [ 3 ]

3 голосов
/ 14 апреля 2011

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

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

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

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

0 голосов
/ 24 сентября 2013

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

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

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

0 голосов
/ 14 октября 2010

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

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

...