Silverlight 反应UI和验证
在使用Silverlight 反应UI和验证,silverlight,validation,silverlight-4.0,reactiveui,reactivevalidatedobject,Silverlight,Validation,Silverlight 4.0,Reactiveui,Reactivevalidatedobject,在使用ReactiveUI执行数据验证时,什么是“最佳实践”?假设我有一个视图模型,如下所示: public class MyViewModel: ReactiveObject { public ReactiveAsyncCommand SaveMyDataCommand { get; protected set; } private string _email; public string Email { get { return _email
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);
}
}
以下是我要验证的内容:
sendmail==true
,请确保电子邮件属性中有有效的电子邮件地址。(我并不担心实际的电子邮件地址验证块本身。这只是一个假设情况。)电子邮件
属性,请确保它是有效的电子邮件地址SaveMyDataCommand
不应是可执行的我只是想找一个关于如何使用ReactiveUI进行简单/稍微复杂的数据验证的好例子。有人能解释一下吗?使用ReactiveValidatedObject,然后使用数据注释(在电话上,抱歉发短信)使用ReactiveValidatedObject,然后使用数据注释(在电话上,抱歉发短信)对于任何正在寻找使用
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);
}
}
我希望这对某人有帮助!:) 对于任何正在寻找使用
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);
}
}
我希望这对某人有帮助!:) 谢谢你的回复,保罗。我已切换到
ReactiveValidatedObject
并发现此线程:。我已经用[ValidateViaMethod]
属性标记了我的电子邮件
属性,但我不确定从哪里开始。我创建了一个名为IsEmailValid
的方法,但它似乎从未命中该方法。你有没有一个简单的例子来说明如何做到这一点?ReactiveValidatedObject已经不存在了。感谢Paul的回复。我已切换到ReactiveValidatedObject
并发现此线程:。我已经用[ValidateViaMethod]
属性标记了我的电子邮件
属性,但我不确定从哪里开始。我创建了一个名为IsEmailValid
的方法,但它似乎从未命中该方法。你有没有一个简单的例子来说明如何实现这一点?ReactiveValidatedObject已经不存在了。谢谢你的例子。。。出于好奇,您知道是否有理由对CustomValidationAttribute使用ValidateViaMethod吗?还是只是个人喜好?CustomValidationAttribute很好,因为您可以返回带有所需消息的validationresult,因此更容易从那里概括错误消息。我意识到你也可以使用一个信息资源。但我只是好奇,除了个人偏好之外,是否还有其他原因使用其中一种方法……@PureWeen我使用了ValidatesViaMethod
,只是因为对我来说,查看代码时更容易理解。这就是有效的方法。:)谢谢你的例子。。。出于好奇,您知道是否有理由对CustomValidationAttribute使用ValidateViaMethod吗?还是只是个人喜好?CustomValidationAttribute很好,因为您可以返回带有所需消息的validationresult,因此更容易从那里概括错误消息。我意识到你也可以使用一个信息资源。但我只是好奇,除了个人偏好之外,是否还有其他原因使用其中一种方法……@PureWeen我使用了ValidatesViaMethod
,只是因为对我来说,查看代码时更容易理解。这就是有效的方法。:)