1

を使用してデータ検証を実行する際の「ベスト プラクティス」とは何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 を使用して単純なデータ検証を行う方法と、少し複雑なデータ検証を行う方法の良い例を探しています。誰でもこれに光を当てることができますか?

4

2 に答える 2

3

の使用例を探している他の人のために、これ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);
  }
}

これが誰かに役立つことを願っています!:)

于 2011-08-19T23:47:57.153 に答える
1

ReactiveValidatedObjectを使用してから、データ注釈を使用します(電話で、短いメッセージで申し訳ありません)

于 2011-08-19T01:28:20.960 に答える