2011-01-14 14 views
6

Silverlight 4アプリケーションで簡単なテストページを使用して、カスタム検証ルールを起動しようとしています。CustomValidation属性が機能しないようです。

私はTextBoxとButtonを持っており、検証結果をTextBlockに表示しています。私のビューモデルはTextBoxのTextプロパティにバインドされているNameプロパティを持っています。 Nameプロパティに2つの検証属性、[Required][CustomValidation]があります。

[送信]ボタンを押すと、Requiredバリデーターが正しく起動しますが、カスタムバリデーターの検証メソッド内のブレークポイントは決してヒットしません。ここで

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.customvalidationattribute(v=vs.95).aspxは、ビューモデルのコードです:

<navigation:Page x:Class="Data.Byldr.Application.Views.ValidationTest" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"> 
    <Grid Width="400"> 
    <StackPanel> 
     <TextBox Text="{Binding Name, Mode=TwoWay}" /> 
     <Button Command="{Binding SubmitCommand}" Content="Submit" /> 
     <TextBlock Text="{Binding Result}" /> 
    </StackPanel> 
    </Grid> 
</navigation:Page> 
:ここ

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<ValidationResult>(); 
      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"; 
      } 
     } 
    } 
} 

図であり、これは、なぜ私は、私は非常に慎重にMSの例に従っていると思うように私は、見ることができません

+0

実際の質問と正反対ですが、FWIWでは、Char.IsUpper静的メソッドを使用してチェックを行うことができます。http://msdn.microsoft.com/en-us/library/system.char.isupper(v=VS.100) ).aspx –

答えて

11

Validator.TryValidateObjecthttp://msdn.microsoft.com/en-us/library/dd411803(v=VS.95).aspx)のオーバーロードのMSDNページに記載されているように、オブジェクトレベルの検証のみがこのメソッドでチェックされ、プロパティではRequiredAttributeがチェックされます。

もブール(http://msdn.microsoft.com/en-us/library/dd411772(v=VS.95).aspx)を受け取るオーバーロードを使用して、プロパティレベルの検証を確認するには

だから、なぜドン」TryValidateObject

+0

それは働いた!ありがとう。 –

+0

あなたがコードに書いたとおりに、あなたのために働いたのは何ですか? –

+0

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.customvalidationattribute(v=vs.95).aspxから何をするべきですか? –

11

に余分なパラメータとして「true」を渡すのと同じくらい簡単でなければなりません

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

..あなたはこのような属性を独自の検証を作成Tと、その後

// 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); } 
    } 
のようにそれを使用します
+1

私は[CustomValidation]属性にこれを好む。 –

関連する問題