【问题标题】:Silverlight Validation Not Working with Data AnnotationsSilverlight 验证不使用数据注释
【发布时间】:2011-04-24 23:26:19
【问题描述】:

我有一个表格:

<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"};

我看到表格上的数据,Name的标签是粗体的,表示必填。但是,如果我清空该字段,或者将其设置为长度无效的字符串,则在标签本身或验证摘要上都不会得到验证。我知道文本框在失去焦点之前不会生效,所以我点击了问候字段并输入了文本以确保我已经离开了另一个文本控件。

我在这里错过了什么?

答案:

根据@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,我会研究一下。谢谢!

【问题讨论】:

    标签: silverlight validation xaml data-annotations silverlight-toolkit


    【解决方案1】:

    您错过了实际的验证调用。使用 ValidatesOnExceptions,必须在属性设置器中引发异常,并且在验证时不会自动考虑属性。要使其工作,您需要使用正确的参数调用 System.ComponentModel.DataAnnotations.Validator.ValidateProperty。

    但是,如果使用 Silverlight 4,我建议考虑使用 IDataErrorInfo 进行验证,因为我觉得它提供了更多的灵活性。

    【讨论】:

    • 我同意。 IDataErrorInfo 是一种更好的方法。在我当前的项目中,我的 ViewModel 有一个基类,它实现 IDataErrorInfo 并调用使用 FluentValidation 库的单独验证类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多