Hi, All.
После настойчивых обращений разъяренных пользователей на тему "почему я могу ввести пустую строку" в Silverlight 4 приложении, решил таки сделать "правильную" валидацию на формах ввода данных. Мудрые люди посоветовали воспользоваться DataAnnotations.
Собственно, сделал в ViewModel:
private string _name;
[Required(ErrorMessage = "Name is required.")]
public string Name
{
get { return _name; }
set {
if (_canValidate)
{
Validator.ValidateProperty(value,
new ValidationContext(this, null, null) { MemberName = "Name" });
}
_name = value;
OnPropertyChanged("Name");
}
}
Во View:
<TextBox Name="tbxName" Grid.Row="0" Grid.Column="1" Margin="4" MinWidth="160">
<TextBox.Text>
<Binding Path="Name" ValidatesOnExceptions="True" ValidatesOnDataErrors="True" NotifyOnValidationError="True" ValidatesOnNotifyDataErrors="True" Mode="TwoWay">
</Binding>
</TextBox.Text>
</TextBox>
Запускаю, смотрю — ввел пустое значение в Name, перешел на другой контрол — все шикарно, Name подсветился красным, появился хинт "Name is required.". Просто праздник какой-то.
Но, думаю, надо ж как-то проверять не только при вводе в контрол, но и при сохранении данных (нажатии на кнопку Ok).
Делаю (по-быстрому) в форме:
private void OKButton_Click(object sender, RoutedEventArgs e)
{
var mm = this.DataContext as ViewModel;
try
{
mm.Validate();
mm.UpdateModel();
this.DialogResult = true;
}
catch ( ValidationException ex)
{
MessageBox.Show(ex.Message);
}
}
А во ViewModel:
public void Validate()
{
//Validator.ValidateObject(this, new ValidationContext(this, null, null), true);
var errors = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(this, new ValidationContext(this, null, null), errors, true);
if(!isValid)
{
throw new ValidationException( string.Join( Environment.NewLine, errors.Select((e) => e.ErrorMessage )));
}
}
Собственно система то валидирует, но красивых рюшечек с подстветкой НЕТ! Вопрос, можно ли как-то красиво пнуть систему, чтобы она делала подстветку валидации не только при обновлении пропертей, но и про "внейшей" проверке?
PS. Надеюсь понятно объяснил, чего хочу

Все-таки бессонные ночи оставляют свой неизгладимый след...