我正在尝试对文本框进行简单验证,它是必填字段,不能为空。最初值为空,因此当用户不在字段中输入任何值并直接单击“保存”按钮时,不会触发valitaion。当用户键入内容然后从中删除值然后它完美地工作并显示验证错误消息时,它工作正常。用户点击保存按钮后,还是要进行验证检查。
[Display(Name = "Sometext", Description = "Some text")]
[Required(ErrorMessage = "Required Field")]
public string SomeText
{
get
{
return _someText;
}
set
{
if (_someText== value &&
value != string.Empty)
{
return;
}
Validate(value, "someText");//This calls Validator.ValidateProperty method
_someText= value;
FirePropertyChanged("someText");
}
}
请建议!
提前致谢 西
答案 0 :(得分:1)
Josh Twist为此做了一个工作。这完美地运作..
http://www.thejoyofcode.com/Silverlight_Validation_and_MVVM_Part_II.aspx
答案 1 :(得分:1)
您也可以调用命令执行
Validator.ValidateObject(this, new ValidationContext(this,null,null),true);
这应验证viewmodel上的所有属性,假设您从viewmodel
调用此属性编辑:对评论的回复
你可以在你的BaseViewModel(每个viewmodel扩展BaseViewModel)中拥有这样的属性(如下所示),然后禁止使用正确的消息保存
protected bool HasValidationErrors
{
get
{
try {
Validator.ValidateObject(this, new ValidationContext(this, null, null), true);
return false;
}
catch (ValidationException) { return true; }
}
}
在你的命令中你会这样称呼它
public void SaveCommandExecuted(object parameter)
{
if (HasValidationErrors)
{
ShowValidationError();
}
}
另一件事,您可以尝试将验证错误的View事件绑定到viewmodel中的侦听器
MyProgram.ViewModels.BaseViewModel baseViewModel = page.Resources["DataSource"] as MyProgram.ViewModels.BaseViewModel;
page.BindingValidationError += new EventHandler<ValidationErrorEventArgs>(baseModel.OnValidationError);
然后在你的BaseViewModel
中private ObservableCollection<ValidationError> Errors { get; set; }
public void OnValidationError(object sender, ValidationErrorEventArgs e)
{
switch (e.Action)
{
case ValidationErrorEventAction.Added:
Errors.Add(e.Error);
break;
case ValidationErrorEventAction.Removed:
Errors.Remove(e.Error);
break;
default:
break;
}
}
然后将HasValidationErrors修改为
protected bool HasValidationErrors
{
get
{
try {
Validator.ValidateObject(this, new ValidationContext(this, null, null), true);
return this.Errors.Count != 0;
}
catch (ValidationException) { return true; }
}
}