CustomValidation属性似乎不起作用

我在Silverlight 4应用程序中有一个简单的测试页面,我正在尝试获取自定义validation规则。

我有一个TextBox和一个Button,我在TextBlock中显示validation结果。 我的视图模型有一个Name属性,它绑定了TextBox的Text属性。 我在Name属性上有两个validation属性, [Required][CustomValidation]

当我点击提交按钮时,必需的validation器正确触发,但我的自定义validation器的validation方法内的断点永远不会被命中。 我不明白为什么会这样,因为我认为我非常仔细地遵循了MS的例子: http : //msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.customvalidationattribute(v = vs.95)的.aspx

以下是视图模型的代码:

 using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using GalaSoft.MvvmLight.Command; namespace MyProject { // custom validation class public class StartsCapitalValidator { public static ValidationResult IsValid(string value) { // this code never gets hit if (value.Length > 0) { var valid = (value[0].ToString() == value[0].ToString().ToUpper()); if (!valid) return new ValidationResult("Name must start with capital letter"); } return ValidationResult.Success; } } // my view model public class ValidationTestViewModel : ViewModelBase { // the property to be validated string _name; [Required] [CustomValidation(typeof(StartsCapitalValidator), "IsValid")] public string Name { get { return _name; } set { SetProperty(ref _name, value, () => Name); } } string _result; public string Result { get { return _result; } private set { SetProperty(ref _result, value, () => Result); } } public RelayCommand SubmitCommand { get; private set; } public ValidationTestViewModel() { SubmitCommand = new RelayCommand(Submit); } void Submit() { // perform validation when the user clicks the Submit button var errors = new List(); if (!Validator.TryValidateObject(this, new ValidationContext(this, null, null), errors)) { // we only ever get here from the Required validation, never from the CustomValidator Result = String.Format("{0} error(s):\n{1}", errors.Count, String.Join("\n", errors.Select(e => e.ErrorMessage))); } else { Result = "Valid"; } } } } 

以下是观点:

     

如MSDN页面上针对Validator.TryValidateObjecthttp://msdn.microsoft.com/en-us/library/dd411803 ( v=VS.95 ) .aspx )的重载所述,仅检查对象级validation使用此方法,以及属性上的RequiredAttribute。

要检查属性级validation,请使用也需要bool的重载( http://msdn.microsoft.com/en-us/library/dd411772(v=VS.95).aspx )

所以它应该像将“true”作为额外参数传递给TryValidateObject一样简单

为什么不像这样创建自己的Validation属性..

 using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; public class StartsCapital : ValidationAttribute { protected override ValidationResult IsValid(object value, ValidationContext validationContext) { var text = value as string; if(text == null) return ValidationResult.Success; if (text.Length > 0) { var valid = (text[0].ToString() == text[0].ToString().ToUpper()); if (!valid) return new ValidationResult("Name must start with capital letter"); } return ValidationResult.Success; } } 

然后像使用它一样

  // my view model public class ValidationTestViewModel : ViewModelBase { // the property to be validated string _name; [Required] [StartsCapital] public string Name { get { return _name; } set { SetProperty(ref _name, value, () => Name); } }