Проверка данных в ListBox в WPF - PullRequest
       4

Проверка данных в ListBox в WPF

4 голосов
/ 13 декабря 2010

У меня есть ListBox, связанный с ObservableCollection типа T - каждый ListBoxItem - это флажок с IsChecked, привязанный к свойству bool в T. Я хочу проверить отмеченные элементы в ListBox, чтобы был установлен хотя бы один флажокесли ни один из флажков не отмечен, я хочу показать красную рамку (стандартное уведомление о валидации) вокруг ListBox.

Как мне это сделать?Могу ли я использовать ValidatesOnDataErrors?

Ответы [ 2 ]

1 голос
/ 13 декабря 2010

Реализуйте IDataErrorInfo в классе, который предоставляет свойство ObservableCollection<T>, и заставьте индексатор возвращать ошибку для имени этого свойства, если все объекты в коллекции имеют значение false в своем логическом свойстве. Затем используйте DataErrorValidationRule в вашей привязке ValidationRules.

0 голосов
/ 05 июня 2018

Ваша цель состоит в проверке выбранных элементов из ListBox: требуется как минимум один выбранный элемент. Во-первых, есть разные способы обработки самого выбора:

a) Вы можете использовать механизм выбора ListBox через ListBox.SelectedItem. Полагаю, вы можете указать привязку как SelectedItem="{Binding SelectedThing, ValidatesOnNotifyDataErrors=True}" и регулярная проверка WPF работает. Не уверен, хорошо ли это работает с множественным выбором.

b) Вы можете использовать ListBox.SelectedItems. Привязка невозможна и должна быть подделана с помощью кода за обработчиком событий. Таким образом, валидация WPF не может быть запущена здесь.

c) Вы используете свое собственное свойство IsSelected (или подобное) для каждого элемента, либо явно привязанное к вашей модели просмотра через CheckBox, либо косвенно через ListBoxItem.IsSelected (через ListBox.ItemContainerStyle).

Здесь вы можете создать свойство bool IsValidSelection в вашей модели представления, которое будет обновляться при изменении выбора. Или вы можете запустить правила проверки для любого из результирующих свойств вашей модели представления (например, SelectedItems). Тем не менее, вы не проверяете само ограничение ListBox.ItemSource! Поэтому стандартные механизмы WPF не работают (поле со списком не получает красной границы или чего-либо еще).

Обходные

Вы можете явно создавать уведомления об ошибках, показывая невидимое в противном случае Label и связывая его видимость с вышеупомянутым свойством bool IsValidSelection. Это очень явный способ, вообще не использующий проверку WPF.

Вы можете изменить INotifyDataErrorInfo (или аналогичную) реализацию, чтобы вызвать ошибки для другого имени свойства. Это невозможно, если вы используете общий ValidatableViewModel<T> (как и я). Я предполагаю, что это было намерением другого ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...