2013-04-03 5 views
1

У меня возникли проблемы с проверкой текстового поля в столбце DataTemplate сетки. Свойство, связанное с текстовым полем, является «двойным» значением. Вот мой XAML код TextBoxПроверка достоверности Проверка Silverlight

<TextBox Text="{Binding SubTotalRawHours, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}" 
               MinHeight="24" VerticalAlignment="Top" BindingValidationError="ValidateTime" /> 

и здесь свойство

private double _SubTotalRawHours; 
     public double SubTotalRawHours 
     { 
      get { return _SubTotalRawHours; } 
      set 
      { 
       if (value < 0) 
       { 
        throw new Exception("Value not allowed"); 
       } 
       _SubTotalRawHours = value; 
       NotifyPropertyChanged("SubTotalRawHours"); 
      } 
     } 

Теперь странный вопрос в том, что если я вхожу алфавитов, код отображения всплывающей подсказки с сообщением об ошибке «Вход не в правильном формате ", что является правильным. Но если я ввожу отрицательное значение, я получаю исключение «Исключение не обрабатывалось кодом». , который здесь происходит

if (value < 0) 
       { 
        throw new Exception("Value not allowed"); 
       } 

Я пробовал все, я даже пытался поставить текстовое поле вне сетки, но его не работает.

Приятно оценить некоторые входы здесь.

Edit 1

ОК, сейчас я сделал некоторые изменения в код и у меня есть обходной путь, вместо "ValidatesOnExceptions=True", я "ValidatesOnDataErrors=True" и мой класс модели теперь также наследует от IDataErrorInfo и я внедрили IDataErrorInfo memeber в моем классе

private string _dataError = string.Empty; 
     const string _ErrorsText = "Errors"; 
     string IDataErrorInfo.Error 
     { 
      get { return _dataError; } 
     } 
     public string this[string propertyName] 
     { 
      get 
      { 
       _dataError = null; 
       switch (propertyName) 
       { 
        case "OldHours": 
         if (OldHours < 0 || OldHours > 100) 
         { 
          return "Please enter a value between 0 - 100."; 
         } 
         break; 
       } 
       return null; 
      } 
     } 

Это работает (кроме подсказки, показывая на неправильном месте, но это нормально). Я все еще не понимаю, почему мой код не заметил никаких исключений. Есть ли что-то, что я должен был добавить в мой модельный класс?

+0

Внутреннее исключение подходит как null. –

+0

Я думаю, что трудно сказать точную проблему. кулак, вы предоставляете нам более подробную информацию. Потому что отсюда нет никакой ошибки. –

+0

Посмотрите на эту статью Я попытался следовать ей http://www.codeproject.com/Articles/86955/Silverlight-4-Data-Validation-Tip-of-the-Day-Part Кроме того, я не уверен какую другую информацию я могу предоставить? –

ответ

1

Если Visual Studio настроен на разрыв пользовательских необработанных исключений, он сломается до того, как фреймворки проверки обрабатывают исключение. Вы можете tell the debugger to ignore validation exceptions при отладке, которая позволяет фреймворку проверки обрабатывать исключение без нарушения исполнения.

+0

Очень ценится. Я думаю, что вчера задал вам этот вопрос в отдельном потоке, где вы предложили несколько схожий ответ. Я также рассмотрел несколько статей, которые предлагают то же самое, но я не был уверен, потому что он больше походил на обходное решение, а не на решение. Наконец, я использовал «ValidatesOnDataErrors = True», а затем реализовал проверку в свойстве IDataErrorInfo. Прохождение статьи, которую вы предоставили, похоже, что это единственное исправление. Если это тогда, Microsoft должна обеспечить лучшую проверку для silverlight или, по крайней мере, лучшую документацию. –

+0

У меня лично не было этой проблемы, по какой-то причине я, должно быть, изменил некоторые настройки или что-то в Visual Studio, так что это кажется немного хитом и пропуском. Рад, что вы его отсортировали;) – Alyce

-3

ваш код setter генерирует исключение, обрабатывал ли ваш код call/client/перехватывал исключение?

Скорее всего, нет, поэтому у вас есть «необъявленное исключение».

простой тест, изменить исключение throw, чтобы всплывающее окно сообщения, исключение unhandle исчезнет.

+0

Это то, что я думал, но если вы посмотрите на какие-либо из статей или руководств по проверке silverlight, вы увидите, что вам не нужно добавлять обработчик исключительных событий для его обработки. «ValidatesOnExceptions = True», как предполагается, обрабатывает все исключения. Но чтобы проверить это, я добавил evenHandler BindingValidationError = "ValidateTime", чтобы поймать исключение, но это тоже не работает. –

Смежные вопросы