ReactiveUI и валидация - PullRequest
       5

ReactiveUI и валидация

1 голос
/ 19 августа 2011

Что считается «наилучшей практикой» при проверке данных при использовании ReactiveUI?Допустим, у меня есть модель представления, которая выглядит следующим образом:

public class MyViewModel: ReactiveObject
{
    public ReactiveAsyncCommand SaveMyDataCommand { get; protected set; }

    private string _email;
    public string Email
    {
        get { return _email; }
        set
        {
          _email = value;
          raisePropertyChanged("Email");
        }
    }

    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
          _name= value;
          raisePropertyChanged("Name");
        }
    }

    private bool _sendEmail = false;
    public bool SendEmail
    {
        get { return _sendEmail; }
        set
        {
          _sendEmail = value;
          raisePropertyChanged("SendEmail");
        }
    }  

    public MyViewModel()
    {
        SaveMyDataCommand = new ReactiveAsyncCommand(null, 1);
    }
}

Вот что я хочу проверить:

  1. Если SendEmail == true, убедитесь, что в адресе указан правильный адрес электронной почты.свойство Email.(Меня не беспокоит сам факт проверки адреса электронной почты. Это всего лишь сценарий что, если .)
  2. Если для свойства Email было задано значение, убедитесь, чтоэто действительный адрес электронной почты.
  3. Если 1 или 2 не пройден, SaveMyDataCommand не должен быть исполняемым.

Я просто ищу хороший пример того, каксделать простую / чуть более сложную проверку данных с использованием ReactiveUI.Кто-нибудь может пролить свет на это?

Ответы [ 2 ]

3 голосов
/ 20 августа 2011

Для тех, кто ищет пример использования ReactiveValidatedObject, вот что сработало для меня.Обратите внимание, что вам также нужно добавить ссылку на System.ComponentModel в ваш класс.

public class MyViewModel: ReactiveValidatedObject
{
  public ReactiveAsyncCommand SaveMyDataCommand { get; protected set; }

  // THIS PROPERTY INDICATES WHETHER ALL FIELDS HAVE BEEN VALIDATED
  public bool IsSaveEnabled
  {
    get { return IsObjectValid(); }
  }

  private string _email;
  [ValidatesViaMethod(AllowBlanks=true,AllowNull=true,Name="IsEmailValid",ErrorMessage="Please enter a valid email address")]
  public string Email
  {
    get { return _email; }
    set
    {
      _email = value;
      raisePropertyChanged("Email");
      SendEmail = SendEmail;
      raisePropertyChanged("IsSaveEnabled");
    }
  }

  private string _name;
  public string Name
  {
    get { return _name; }
    set
    {
      _name= value;
      raisePropertyChanged("Name");
    }
  }

  private bool _sendEmail = false;
  [ValidatesViaMethod(Name = "IsSendEmailValid", ErrorMessage = "Make sure a valid email address is entered.")]
  public bool SendEmail
  {
    get { return _sendEmail; }
    set
    {
      _sendEmail = value;
      raisePropertyChanged("SendEmail");
      raisePropertyChanged("IsSaveEnabled");
    }
  }  

  public bool IsEmailValid(string email)
  {
    if (string.IsNullOrEmpty(email))
    {
      return true;
    } 

    // Return result of Email validation
  }

  public bool IsSendEmailValid(bool sendEmail)
  {
     if (sendEmail)
     {
       if (string.IsNullOrEmpty(Email))
       {
         return false;
       }

       // Return result of Email validation
     }
  }

  public MyViewModel()
  {
    SaveMyDataCommand = new ReactiveAsyncCommand(null, 1);
  }
}

Надеюсь, это кому-нибудь поможет!:)

1 голос
/ 19 августа 2011

Используйте ReactiveValidatedObject, затем используйте аннотации данных (по телефону, извините за короткое сообщение)

...