Проверка Silverlight не работает с аннотациями данных - PullRequest
3 голосов
/ 13 октября 2010

У меня есть форма:

<StackPanel x:Name="LayoutRoot">
    <sdk:ValidationSummary />

    <sdk:Label Target="{Binding ElementName=Greeting}" />
    <TextBox x:Name="Greeting" Text="{Binding Greeting, Mode=TwoWay,
        ValidatesOnExceptions=True, NotifyOnValidationError=True}" />

    <sdk:Label Target="{Binding ElementName=Name}" />
    <TextBox x:Name="Name" Text="{Binding Name, Mode=TwoWay,
        ValidatesOnExceptions=True, NotifyOnValidationError=True}" />
</StackPanel>

И простой класс, который устанавливается как DataContext ...

  public class Person : INotifyPropertyChanged
    {
        private string _greeting;

        private string _name;

        public string Greeting
        {
            get { return _greeting; }
            set
            {
                _greeting = value;
                InvokePropertyChanged(new PropertyChangedEventArgs("Greeting"));
            }
        }

        [Required(ErrorMessage = "Name must be provided")]
        [StringLength(15, MinimumLength = 5,
            ErrorMessage = "Name should be 5 to 15 characters")]
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                InvokePropertyChanged(new PropertyChangedEventArgs("Name"));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void InvokePropertyChanged(PropertyChangedEventArgs e)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, e);
        }
    }

Я установил контекст данных со следующей строкой в ​​коде позади xaml:

    DataContext = new Person {Name = "Joe User"};

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

Что мне здесь не хватает?

Ответ:

За ответ @Alex Paven, чтобы он работал с аннотациями данных, которые вы используете:

[Required(ErrorMessage = "Name must be provided")]
[StringLength(15, MinimumLength = 5,
    ErrorMessage = "Name should be 5 to 15 characters")]
public string Name
{
    get { return _name; }
    set
    {
        Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "Name" });
        _name = value;
        InvokePropertyChanged(new PropertyChangedEventArgs("DisplayName"));
    }
}

Что касается IDataErrorInfo, я рассмотрю его. Спасибо!

1 Ответ

2 голосов
/ 13 октября 2010

Вы пропустили фактический проверочный вызов. С ValidatesOnExceptions исключение должно быть брошено в установщик свойства, и атрибуты не учитываются автоматически при проверке. Чтобы это работало, вам нужен вызов System.ComponentModel.DataAnnotations.Validator.ValidateProperty с правильными параметрами.

Однако, если вы используете Silverlight 4, я бы посоветовал изучить проверку с IDataErrorInfo, так как я чувствую, что она предлагает гораздо большую гибкость.

...