I have a simple test page in my Silverlight 4 application in which I am trying to run a custom validation rule.
I have a TextBox and a button, and I show the results of the check in a TextBlock. My view model has a Name property that binds the Text property to a TextBox. I have two validation attributes for the Name property, [Required] and [CustomValidation] .
When I click the submit button, the required validator works correctly, but the breakpoint inside the validation method of my custom validator never hits. I do not understand why this is the way I think, I carefully followed the example of MS: http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.customvalidationattribute(v=vs.95) .aspx
Here is the view model code:
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"; } } } }
Here is a view:
<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>
c # validation silverlight mvvm data-annotations
Mike chamberlain
source share