Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Silverlight Validator problem / 11 сообщений из 11, страница 1 из 1
22.11.2011, 12:52
    #37538420
Alex Marmuzevich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Silverlight Validator problem
Hi, All.
После настойчивых обращений разъяренных пользователей на тему "почему я могу ввести пустую строку" в Silverlight 4 приложении, решил таки сделать "правильную" валидацию на формах ввода данных. Мудрые люди посоветовали воспользоваться DataAnnotations.
Собственно, сделал в ViewModel:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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:
Код: plaintext
1.
2.
3.
4.
5.
6.
<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).
Делаю (по-быстрому) в форме:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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. Надеюсь понятно объяснил, чего хочу :) Все-таки бессонные ночи оставляют свой неизгладимый след...
...
Рейтинг: 0 / 0
22.11.2011, 16:04
    #37538830
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Silverlight Validator problem
Alex MarmuzevichСобственно система то валидирует, но красивых рюшечек с подстветкой НЕТ! Вопрос, можно ли как-то красиво пнуть систему, чтобы она делала подстветку валидации не только при обновлении пропертей, но и про "внейшей" проверке?

Пробежаться по всем свойствам зависимостей всех объектов в визуальном дереве. Каждому найденному биндингу сделать b.UpdateTarget(); b.UpdateSource(); .
...
Рейтинг: 0 / 0
22.11.2011, 17:38
    #37539064
Alex Marmuzevich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Silverlight Validator problem
Спасибо. Это я видел, но жутко не понравилось.
Получилось по-другому. Перешел на INotifyDataErrorInfo + на Validate сделал
Код: plaintext
1.
2.
3.
4.
5.
6.
Name = Name; // дало нужные рюшечки
if ( HasErrors) { // реализовало защиту.
  MessageBox.Show("Validation failed" );
  return false;
}
return true;

Новый OKButton_Click (пока не убил):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
private void OKButton_Click(object sender, RoutedEventArgs e)
{
  var mm = this.DataContext as ViewModel;
  if ( !mm.Validate() ) return;
  mm.UpdateModel();
  this.DialogResult = true;
}

Работает, и рюшечки есть, и с биндингом особо не заморачиваюсь... Хотя как-то не сильно кошерно и без Validator'а. И не понятно, как можно было его заставить выполнить такую же проверку, но с "рюшечками"
...
Рейтинг: 0 / 0
22.11.2011, 17:42
    #37539074
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Silverlight Validator problem
Alex MarmuzevichСпасибо. Это я видел, но жутко не понравилось.
Получилось по-другому. Перешел на INotifyDataErrorInfo + на Validate сделалВалидация может быть прописана не только в модели, но и в представлении (Binding + ValidationRule). Как в этом случае будете?
...
Рейтинг: 0 / 0
22.11.2011, 18:03
    #37539116
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Silverlight Validator problem
Алексей КAlex MarmuzevichСпасибо. Это я видел, но жутко не понравилось.
Получилось по-другому. Перешел на INotifyDataErrorInfo + на Validate сделалВалидация может быть прописана не только в модели, но и в представлении (Binding + ValidationRule). Как в этом случае будете?

Никак. Нечего ей там делать
...
Рейтинг: 0 / 0
22.11.2011, 18:05
    #37539118
Alex Marmuzevich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Silverlight Validator problem
Алексей КAlex MarmuzevichСпасибо. Это я видел, но жутко не понравилось.
Получилось по-другому. Перешел на INotifyDataErrorInfo + на Validate сделалВалидация может быть прописана не только в модели, но и в представлении (Binding + ValidationRule). Как в этом случае будете?
Ну тут вариантов не останется, кроме как полазить по дереву и сделать UpdateTarget, UpdateSource.
Но я уж постараюсь валидировать все-таки в модели.
...
Рейтинг: 0 / 0
22.11.2011, 18:08
    #37539120
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Silverlight Validator problem
SeVaНикак. Нечего ей там делатьПочему?
...
Рейтинг: 0 / 0
24.11.2011, 11:27
    #37541969
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Silverlight Validator problem
Алексей КSeVaНикак. Нечего ей там делатьПочему?
влезу. так сказать.
Леша, видимо совсем переработал.
А если модель начать использовать, например вообще в другом приложении, то опять придётся лепить валидатор, а как же ооп?
По 10 раз в разных местах, не айс.
...
Рейтинг: 0 / 0
24.11.2011, 13:53
    #37542348
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Silverlight Validator problem
ProgaА если модель начать использовать, например вообще в другом приложении, то опять придётся лепить валидатор, а как же ооп?А если нет? А если модель одна, а правила валидации разные? Это у кого как. Поэтому так категорично заявлять о ненужности валидации во View я бы не стал.
...
Рейтинг: 0 / 0
24.11.2011, 13:59
    #37542369
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Silverlight Validator problem
Алексей КА если модель одна, а правила валидации разные?
это наверное всё-таки разные модели. Общего предка имеют - другое дело
...
Рейтинг: 0 / 0
24.11.2011, 14:48
    #37542488
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Silverlight Validator problem
ИзопропилАлексей КА если модель одна, а правила валидации разные?
это наверное всё-таки разные модели. Общего предка имеют - другое делоМожет быть. Да и дело даже не в этом. Классы модели кодосгенерированы. Ради бантиков первичной валидации на клиенте расширять их через partial или куда-то инкапсулировать откровенно говоря лень. Проще напихать валидаторов во view.

Случаи, когда одна и та же модель редактируется ререз разные view крайне редки, если вообще встречаются. Поэтому ничего плохого в этом не вижу.
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Silverlight Validator problem / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]