Обработка исключений (валидация) в WPF DataGrid - PullRequest
2 голосов
/ 19 марта 2012

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

<DataGridTextColumn Binding="{Binding IntegerProperty, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True, ValidatesOnExceptions=True}" />

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

Есть ли способ заставить исключение, выброшенное, в поведении установщика свойств вести себяТочно так же, как механизм привязки для обработки исключений FormatException?Самое большое раздражение в том, что ошибка проверки удаляется после выхода из ячейки.

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Я думаю, вы НЕ должны бросать исключение в установщик свойств.

Возьмите под контроль проверку, создав собственные объекты ValidationRules.

Это может помочь вам, или вы можете быть выше этого. http://www.wpfsharp.com/2012/02/03/how-to-disable-a-button-on-textbox-validationerrors-in-wpf/

Когда исключение находится в пользовательском интерфейсе, недопустимое значение даже не передается в связанное свойство.

Кроме того, вы можете обработать исключение, а не просто выбросить его и установить для свойства значение по умолчанию или очистить его или что-то еще.

0 голосов
/ 02 мая 2012

Нет ничего плохого в создании исключения в сеттере. В конце концов, некоторые сеттеры вызывают проверку или другие процедуры, пока они установлены. Например, у меня может быть свойство Connected для базы данных, которая пытается открыть соединение с базой данных, когда установлено значение true. Это может быть установлено на кнопку переключения в моем окне wpf. Тем не менее, вы можете создать слушателя - что-то похожее на эту ссылку: http://www.switchonthecode.com/tutorials/wpf-snippet-detecting-binding-errors.

В моем случае я использую MVVM и платформу Prism / Unity. Как только я получаю значение и либо перехватываю исключение, либо вызываю его, я вызываю внутреннее событие в моей модели представления с именем NotifyViewOfException. Я передаю объект исключения, и он обрабатывает его оттуда, отображая окно. Вам не нужно использовать Prism / Unity для этого. Судя по твоему описанию, я не знаю, что ты используешь, поэтому не буду вдаваться в подробности об этом куске.

...