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