使用DataAnnotations在MVVM中进行验证

时间:2009-11-17 15:28:46

标签: silverlight data-binding silverlight-3.0 validation

我发现了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 :(得分:0)

不幸的是,没有更好的方法可以做到这一点。基于验证器进行UI更新的唯一方法是在绑定的setter中。

我认为,这是Silverlight中验证系统的一个巨大限制。 JoyOfCode文章真的是最好的方法。

我还建议你可以将错误绑定到viewmodel的article by the same publisher,但它不能反过来。

答案 1 :(得分:0)

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