Исключение, вызывающее разрыв во время отладки вместо проверки привязки в Silverlight на Windows Phone - PullRequest
0 голосов
/ 27 июля 2011

Я пытаюсь реализовать проверку привязки с помощью Silverlight на Windows Phone, но все, что я получаю, это взлом отладчика вместо необработанного исключения, а проверка не происходит.

Я следую рекомендациям из статьи MSDN о Привязка данных .

Вот что я пытался сделать, чтобы настроить его:

Отладка -> Исключения -> Общепринятые языковые исключения во время выполнения - необработанный пользователь не проверен

В шаблоне данных для ListBoxItem я объявляю двустороннюю привязку с проверками:

<TextBox x:Name="LastReadingValue" Text="{Binding LastReadingValue, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True}" />

В установщике я вызываю исключение, если данные TextBox неверны:

public string LastReadingValue
        {
            get
            {
                return _lastReadingValue;
            }
            set
            {
                try
                {
                    double reading = System.Convert.ToDouble(value);
                    _lastReadingValue = String.Format("{0:0.00}", reading);
                }
                catch (FormatException fe)
                {
                    throw new Exception("The meter reading must be a number like 7561.41");
                }
                NotifyOfPropertyChanged("LastReadingValue");
            }
        }

В ListBox я объявляю обработчик для события BindingValidationError:

<ListBox x:Name="NewMeterReadingsListBox" ItemsSource="{Binding Meters}" ItemTemplate="{StaticResource NewMeterReadingDataTemplate}" BindingValidationError="ListBox_BindingValidationError"/>

Обработчик для BindingValidationError никогда не вызывается:

private void ListBox_BindingValidationError(object sender, ValidationErrorEventArgs e)
        {
            Debug.WriteLine("BindingValidationError");
        }

1 Ответ

1 голос
/ 28 июля 2011

ОК - вторая попытка ответа.

Пара интересных вещей произошла, когда я попробовал это сам. Я начал с приложения WindowsPhoneDataboundApplication, затем добавил TextBox и проверку в ListBox приложения. Я использую инструменты WP Mango Beta 2 (а не вчерашнее обновление Beta 2).

  1. При отладке: если введено недопустимое значение, я получаю отладочный перерыв и запрос от VS в строке throw говорит, что исключение не обработано. ОДНАКО: обработчик BindingValidationError вызывается нормально, приложение продолжает работать, а Application.UnhandledException не вызывается.
  2. В функции _BindingValidationError текст Debug.WriteLine часто трудно обнаружить с другим текстом исключения в окне вывода. Если вы сделаете это более очевидным, введя новую строку, вы должны заметить текст:

    Debug.WriteLine("\n\n*** BindingValidationError ***\n");

Так что в основном это работает для меня, но есть несколько вещей, на которые следует обратить внимание при отладке.

Если вы ориентируетесь на WP Mango, я бы порекомендовал вам рассмотреть способ проверки данных Silverlight 4, который не включает в себя выброс и перехват исключений - я согласен с Клаусом, поскольку использование исключений - это действительно уродливый способ проверки. , Альтернатива SL4 предполагает реализацию интерфейсов IDataErrorInfo и INotifyDataErrorInfo в вашем связанном классе. Я лично не пробовал этот подход лично.

Edit:

Если вы действительно хотите отключить перерыв для исключений, вы можете сделать это из меню «Отладка» VS2010, пункт «Исключения». Затем отмените выбор типа исключения, для которого VS не должен прерываться, если он не обработан.

Если вы создадите свой собственный класс Exception только для проверки привязки и отключите отладочный разрыв только для этого типа Exception, то вы сможете иметь нормальное поведение VS для исключений вашего приложения, за исключением случаев, когда имеют дело со сбоями привязки.

...