Как удалить одно или несколько полей из события DataForm.Validating () в Silverlight 4? - PullRequest
4 голосов
/ 01 июля 2011

У меня есть форма данных, которая привязана к объекту, свойства которого украшены System.ObjectModel.DataAnnotation атрибутами для проверки.

Проблема, с которой я сталкиваюсь, заключается в том, что некоторые свойства этого класса нужны только условно и делаютне нужно подтверждать.Например, когда администратор приложения решает отредактировать пользователя, он или она может ввести пароль / подтверждение пароля / вопрос о пароле / ответ на пароль.Или он / она может полностью пропустить эти свойства.

Поэтому, если администратор решит ввести любое из этих 4 полей, они все должны присутствовать, и должны быть применены правила проверки для всех этих полей.Однако, если администратор хочет изменить только FirstName, LastName, Email или любые другие произвольные свойства - поля, связанные с паролем, проверять не нужно.

Есть ли способ «исключить» их из проверки?process?

это пример объекта, с которым я работаю:

public class RegistrationData
{
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public string Email { get; set; }
   public string Username { get; set; }
   public string Password { get; set; }
   public string PasswordConfirm { get; set; }
   public string PasswordQuestion { get; set; }
   public string PasswordAnswer { get; set; }
}

У меня есть DataForm с именем registrationForm в Xaml, и я получаю ошибку в следующем коде:

private void RegistrationButton_Click(object sender, RoutedEventArgs e)
{
   if( this.registerForm.ValidateItem() )
   {
       //Does not pass validaton if the password properties are not filled in.
   }
}

Любые идеи о том, как это исправить?

Я думал об использовании двух DataForms ... и разделить пользовательский объект на две, но это включает в себя много кода ...

Ответы [ 3 ]

1 голос
/ 22 мая 2012

Этот вопрос привел меня к другому решению.Теперь я использую CustomValidation:

[CustomValidation(typeof(RegistrationDataValidation), "ValidatePassword")]
public class RegistrationData  
{  
    public bool IsNewUser { get; set; }
     ... // other registration properties
}  

public static class RegistrationDataValidation
{
    public static ValidationResult ValidatePassword(MembershipServiceUser user, ValidationContext context)
    {
        if (user.IsNewUser && string.IsNullOrEmpty(user.Password))
        {
            return new ValidationResult("Password required");
        }
        return ValidationResult.Success;
    }
}

Я добавил свойство IsNewUser, которое я установил в клиенте при добавлении нового пользователя.Пользовательский метод проверки проверяет это свойство и выполняет требуемую проверку.У меня все еще есть атрибут RegularExpression для пароля, который также будет проверен.

По сравнению с решением @ Staindart это проверяется на клиенте синхронно.

1 голос
/ 17 мая 2012

Я бы порекомендовал использовать интерфейс INotifyDataError для вашего объекта RegistrationData.

    public string LabelWrapper
    {
        get
        {
            return this.Label;
        }
        set
        {
            ValidateRequired("LabelWrapper", value, "Label required");
            ValidateRegularExpression("LabelWrapper", value, @"^[\w-_ ]+$", "Characters allowed (a-z,A-Z,0-9,-,_, )");
            this.Label = value;
            this.RaisePropertyChanged("LabelWrapper");
        }
    }

    public string DependentLabelWrapper
    {
        get
        {
            return this.DependentLabel;
        }
        set
        {
            if(LabelWrapper != null){
                ValidateRequired("DependentLabelWrapper", value, "Label required");
                ValidateRegularExpression("LabelWrapper", value, @"^[\w-_ ]+$", "Characters allowed (a-z,A-Z,0-9,-,_, )");
             }
            this.DependentLabel = value;
            this.RaisePropertyChanged("DependentLabelWrapper");
        }
    }

Я рекомендую вам просмотреть эту ссылку http://blogs.msdn.com/b/nagasatish/archive/2009/03/22/datagrid-validation.aspx, чтобы узнать больше о различных типах проверки.

Также в MSDN есть хорошее объяснение, как его использовать

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifydataerrorinfo%28VS.95%29.aspx

0 голосов
/ 19 июня 2012

Самый простой и уродливый способ - подключиться к событию DataForm.ValidatingItem. Вот так:

    void dfEditForm_ValidatingItem(object sender, System.ComponentModel.CancelEventArgs e)
    {
        foreach (ValidationSummaryItem item in dfEditForm.ValidationSummary.Errors)
        {
            if (item.Sources.Where(W => W.PropertyName != "myIgnoredPropertyName").Count() > 0)
                e.Cancel = true;
        }
    }
...