@Jaguar_sea

Как провести валидацию textbox'ов при нажатии кнопки?

В диалоговом окне есть несколько элементов TextBox в которых обновление источника данных отложено до тех пор пока пользователь не нажмет кнопку "ОК". Подскажите пожалуйста как правильно провести валидацию т.е. проверить, нет ли в TextBox'ах, к примеру, пустых значений.

Попробую сформулировать заново свой вопрос. Я пытаюсь разобраться с Entity Framework Code First. У меня есть класс Bank со свойствами, которым назначены различные атрибут, на пример [Required(ErrorMessage = "required")]. Данные байндятся к DataGrid главного окна, соответственно необходимо выполнять CRUD операции. При вызове события добавления создается новый bank, данные в который должны попасть из диалогового окна, точнее из его TextBox-ов. Источник в TextBox-ах обновляется не при вводе данных, а после того как пользователь закончит ввод необходимых значений и нажмет кнопку "ОК" в диалоговом окне, иначе при редактирование выделенного item в DataGrid данные (коллекция) изменялись бы не только в TextBox-ах, но и в самой коллекции в целом т.е. и в главном окне, еще до нажатия пользователем кнопки "ОК".
<TextBox Text="{Binding Path=ItemName, UpdateSourceTrigger=Explicit}" />

Итак источник обновляется когда нажимается кнопка "ОК"
BindingExpression be = itemNameTextBox.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();

Теперь встает вопрос: Как не позволить попасть в коллекцию свойствам с пустыми значениями? На сколько я понял необходимо использовать ValidationRules. К сожалению google так и не смог подыскать для меня подходящий пример такой реализации, собственно поэтому я и написал сюда, с надеждой что более грамотные люди подскажут как это сделать.
Возможно я совсем не так все делаю, я лишь только пытаюсь разобраться в этой технологии. Если вы предложите более простую реализацию, буду очень благодарен.
  • Вопрос задан
  • 3450 просмотров
Пригласить эксперта
Ответы на вопрос 1
aush
@aush
Не бывает абстрактно правильной или неправильной валидации. Все зависит от вашей бизнес-задачи.

На пустое значение можно проверить так:

if (textbox1.Text == string.Empty)

UPD:
В mvvm у вас есть ViewModel, которая привязана ко View: контролы для отображения привязаны к свойствам VM, контролы для управления привязаны к командам VM. Соответственно, когда юзер нажимает на кнопку, из вашего обработчика команды вы имеете доступ к свойстам модели, а значит можете их провалидировать.

UPD2:
Ок, тогда так: во-первых, EF в контексте вашей задачи не имеет значения. Такие вещи как [Required] не завязаны на EF, но EF использует их и не дает работать с данными, которые не проходят валидацию. Конечно, вы можете попробовать залить данные через EF, получить исключение валидации и обработать его, но это грязный ход.

Итак, вы создали новый Bank , установили его моделью для диалогового окна с текстбоксами и привязали к ним свойства Bank. Затем, при нажатии на ОК вы сделали биндингам Update (на мой взгляд - это лишнее, проще в данном случае сделать обычную привязку) и данные из текстбоксов попали в модель. Теперь вам следует, собственно, провалидировать модель:

bool ValidateModel()
{
    var validationContext = new ValidationContext(Bank, null, null);
    var validationResults = new List<ValidationResult>();
    Validator.TryValidateObject(Bank, validationContext, validationResults);

    if (validationResults.Any())
    {
        foreach (var validationResult in validationResults)
        {
            ShowError(validationResult.MemberNames.First(), validationResult.ErrorMessage);
        }

        return false;
    }
    else
    {
        return true;
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы