CustomValidation attribut ne semble pas fonctionner
J'ai une simple page de test dans mon application Silverlight 4, dans lequel j'essaie de faire une règle de validation personnalisée à feu.
J'ai un TextBox et un Bouton, et je suis en train de montrer les résultats de la validation dans un TextBlock. Mon point de vue, le modèle a un Nom de propriété, qui est lié à la propriété Text de la zone de texte. J'ai deux attributs de validation sur le Nom de la propriété, [Required]
et [CustomValidation]
.
Quand j'appuie sur le bouton envoyer, le programme de validation déclenche correctement, mais le point d'arrêt à l'intérieur de la méthode de validation de mon validateur personnalisé n'est jamais touché. Je ne vois pas pourquoi il en est, comme je crois l'avoir suivie MS à l'exemple du très attentivement: http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.customvalidationattribute(v=vs. 95).aspx
Voici le code pour le modèle de vue:
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";
}
}
}
}
Ici est le point de vue:
<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>
- Orthogonale à la question réelle, mais FWIW, vous pouvez effectuer l'enregistrement via le Char.IsUpper méthode statique: msdn.microsoft.com/en-us/library/...
Vous devez vous connecter pour publier un commentaire.
Comme indiqué sur la page MSDN pour que la surcharge de
Validator.TryValidateObject
( http://msdn.microsoft.com/en-us/library/dd411803(v=VS.95).aspx ), seul le niveau de l'objet de validations sont vérifiées avec cette méthode, et RequiredAttribute sur propriétés.Pour vérifier le niveau de la propriété des validations, utilisez la surcharge qui prend également un bool ( http://msdn.microsoft.com/en-us/library/dd411772(v=VS.95).aspx )
Il devrait donc être aussi simple que de passer "vrai" comme un paramètre supplémentaire à
TryValidateObject
Pourquoi ne pas créer votre propre Validation de l'attribut comme ça..
Et de l'utiliser ensuite comme