1

在使用ReactiveUI時執行數據驗證時,什麼被視爲「最佳實踐」?比方說,我有一個看起來像這樣的視圖模型: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然後確保有一個在電子郵件屬性有效的電子郵件地址。 (我並不擔心實際的電子郵件地址驗證部分本身,這只是一個如果情況如何。)
  2. 如果將值設置爲Email屬性,請確保它是有效的電子郵件地址。
  3. 如果1.或2.驗證失敗,SaveMyDataCommand應該不可執行。

我只是尋找一個很好的例子,說明如何使用ReactiveUI做簡單/稍微複雜的數據驗證。任何人都可以對此有所瞭解嗎?

回答

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); 
    } 
} 

我希望這可以幫助別人! :)

+0

感謝您的示例...出於好奇你知道是否有理由使用ValidateViaMethod而不是CustomValidationAttribute?還是僅僅是個人喜好? CustomValidationAttribute非常好,因爲你可以用你想要的消息返回一個validationresult,所以看起來更容易從那裏概括你的錯誤消息。我意識到你也可以使用一個資源的消息。但我只是好奇,除了個人喜好之外,還有什麼原因可以使用另一個... –

+0

@PureWeen我使用'ValidatesViaMethod'只是因爲對我而言,在查看代碼時更容易理解。那和那是有效的方法。 :) –

1

使用ReactiveValidatedObject,然後使用數據註釋(對電話,遺憾的短消息)

+0

感謝您的答覆保羅。我已切換到「ReactiveValidatedObject」,並發現此線程:http://groups.google.com/group/reactivexaml/browse_thread/thread/a88799cad34d2d79。我使用'[ValidateViaMethod]'屬性標記了我的'Email'屬性,但我不確定該從哪裏去。我創建了一個名爲'IsEmailValid'的方法,但它似乎從來沒有碰到過這種方法。你有一個關於如何完成這項工作的簡單例子嗎? –

+0

ReactiveValidatedObject不再存在。 – SuperJMN