在MVVM中使用DataAnnotations进行验证

3

我发现了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

很遗憾,没有更好的方法来解决这个问题。唯一的方法是在绑定的setter中根据验证器更新UI。

我认为这是Silverlight验证系统的一个巨大限制。那篇JoyOfCode文章确实是最好的方法。

我还建议阅读同一出版商的文章,您可以将错误绑定到您的视图模型,但反过来则不行。


0

我也在一个非常大规模的LOB应用程序中使用了Josh的方法,虽然它有些混乱,但确实有效。特别是验证上下文,在处理更复杂的逻辑时可能会帮助你摆脱一些麻烦。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接