Использование DataAnnotations для проверки в MVVM - PullRequest
3 голосов
/ 17 ноября 2009

Я обнаружил новые функции аннотации данных в SL3 и использую их для проверки пользовательского ввода.

У меня есть такие данные:

            <dataInput:Label  Target="{Binding ElementName=inputName}"/>
            <TextBox 
                x:Name="inputName" 
                Text="{Binding RequestDemoData.Name, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}"/>
            <dataInput:DescriptionViewer {Binding ElementName=inputName}"/>

и моя модель выглядит так:

   [Display(ResourceType = typeof(Resources.Resources), Name = "Name", Description = "NameDescription")]
    [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "NameRequired")]
    [RegularExpression(@"^[^0-9]*[a-zA-Z]+[^0-9]*$", ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "NameError")]
    public string Name
    {
        get
        {
            ValidateProperty("Name", _name);
            return _name;
        }
        set
        {
            if (_name != value)
            {
                ValidateProperty("Name", value);
                _name = value;
                OnPropertyChanged("Name");
            }
        }
    }

Пока все хорошо. Если пользователь вводит неправильные данные, я получаю сообщение об ошибке, когда он / она фокусируется. Проблема в том, что у меня есть кнопка отправки, привязанная к ICommand, и я не могу понять, как заставить сообщение об ошибке появляться, когда пользователь щелкает по нему.

Плохой способ - добавить какой-то код позади и сделать GetBindingExpression(foo).UpdateSource(), и с этим можно было бы разобраться. Недостатком является то, что это совершенно неуправляемо, и я ненавижу использовать код в моем представлении.

http://www.thejoyofcode.com/Silverlight_Validation_and_MVVM_Part_II.aspx предложил решение, и я собираюсь последовать ему, но я хотел бы знать, если нет более легкого пути.

Приветствие.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2009

Я также использовал подход Джоша в очень крупномасштабном LOB-приложении, и хотя он грязный, он работает. В частности, контекст проверки, скорее всего, избавит вас от нескольких записок с более сложной логикой.

0 голосов
/ 17 ноября 2009

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

Я считаю, что это огромное ограничение системы проверки в Silverlight. Эта статья JoyOfCode действительно лучший способ сделать это.

Я бы также порекомендовал статью того же издателя , в которой вы можете связать ошибки с вашей моделью представления, но она не работает наоборот.

...