在Silverlight 3中,我正在使用MVVM以及验证原则,即如果发生验证错误,setter会导致异常。我在使用TwoWay的字段上使用绑定语法,即:
<TextBox x:Name="TextBoxClientName" Text="{Binding Name,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=true}" Grid.Column="1" Grid.Row="0" Margin="5 5 5 5" />
我使用Annotations验证ViewModel中的这个属性:
[Required(ErrorMessage = "Name is required")]
public string Name
{
get
{
return _client.Name;
}
set
{
Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "Name", DisplayName="Client Name" });
_client.Name = value;
}
}
我有验证摘要,所有工作都很好但是大声笑,我正在寻找的功能如下:
您有数据表单,我希望验证摘要仅在我单击保存时显示在顶部,而且我还想在该ValidationSummary上实现关闭按钮,以便用户可以继续输入和更正。 / p>
我不确定如何使用validationsummary控制可见性或切换,我尝试了可见性。以下是我尝试过的代码,WHICH确实收集了提交时的错误,但是我不能将它们应用到validationsummary:
public void Save()
{
List<ValidationError> errors = new List<ValidationError>();
foreach (UIElement ui in LayoutRoot.Children)
{
FrameworkElement fe = ui as FrameworkElement;
if (fe != null)
{
foreach (ValidationError ve in Validation.GetErrors(fe))
{
errors.Add(ve);
}
}
}
if (errors.Count > 0)
{
Validation1.DataContext = errors;
Validation1.Filter = ValidationSummaryFilters.All;
}
else
{
if (Saved != null)
Saved(this, EventArgs.Empty);
}
}
干杯,
安德鲁
答案 0 :(得分:1)
我想现在你在你的应用程序中使用了SIlverlight 4。 所以这个答案适用于Silverlight 4。
使用Silverlight 4,新增了INotifyDataError
接口,其中包含3种方法:
public interface INotifyDataErrorInfo
{
// Returns True if the object has at least one property-level or top-level error.
bool HasErrors { get; }
// Returns the current set of property-level errors for the provided property name, or
// the current top-level errors if the argument is null or empty.
IEnumerable GetErrors(string propertyName);
// Raised when the set of errors for a particular property has changed, or when the
// top-level errors have changed.
event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
}
网络上有关于该界面以及如何使用它的大量文档。
如果您不想,则不必使用DataAnotations。但是,如果这样做,您仍然可以使用Validator
命名空间中的System.ComponentModel.DataAnnotations
类来获取验证错误。
如果您使ViewModel实现INotifyDataError
并且还具有属性(在ViewModel中)bool IsValidating
或类似的东西。然后每次属性更改为您要验证的所有属性触发ErrorsChanged事件(您可以使用反射获取属性名称)。就是这样。
现在您只需要IsValidating = false
,然后在请求保存时使用IsValidating = true
显示错误。
你可以做的其他事情(,这适用于Silverlight 3 )是将ValidationSummary的可见性绑定到IsValidating属性(使用IValueConverter),然后从ViewModel控制它。