C# 如何在Silverlight中向ValidationSummary添加关闭按钮

C# 如何在Silverlight中向ValidationSummary添加关闭按钮,c#,silverlight,C#,Silverlight,在Silverlight3中,我使用的是MVVM以及验证原则,即如果发生验证错误,setter将导致异常。I使用双向方式在字段上使用绑定语法,即: <TextBox x:Name="TextBoxClientName" Text="{Binding Name,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=true}" Grid.Column="1" Grid.Row="0" Margin="5 5 5 5"

在Silverlight3中,我使用的是MVVM以及验证原则,即如果发生验证错误,setter将导致异常。I使用双向方式在字段上使用绑定语法,即:

<TextBox x:Name="TextBoxClientName" Text="{Binding Name,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=true}"  Grid.Column="1" Grid.Row="0" Margin="5 5 5 5" />
我有验证摘要,所有工作都很好,但lol,我正在寻找的功能如下:

您有数据表单,我希望验证摘要仅在单击“保存”时显示在顶部,而且我希望在该验证摘要上实现一个关闭按钮,以便用户可以继续输入和更正

我不确定如何使用validationsummary控制的可见性或切换,我已经尝试了可见性。以下是我尝试的代码,它在提交时收集错误,但我无法将它们应用于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);
        }

    }
public void Save()
{
列表错误=新列表();
foreach(LayoutRoot.Children中的UIElement ui)
{
FrameworkElement fe=ui作为FrameworkElement;
如果(fe!=null)
{
foreach(Validation.GetErrors(fe)中的ValidationError ve)
{
错误。添加(ve);
}
}
}
如果(errors.Count>0)
{
Validation1.DataContext=错误;
Validation1.Filter=ValidationSummaryFilters.All;
}
其他的
{
如果(已保存!=null)
已保存(此为EventArgs.Empty);
}
}
干杯


Andrew

我想现在你已经在应用程序中使用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;
}
公共接口INotifyDataErrorInfo
{
//如果对象至少有一个属性级别或顶级错误,则返回True。
布尔HasErrors{get;}
//返回所提供属性名称的当前属性级别错误集,或
//如果参数为null或空,则返回当前顶级错误。
IEnumerable GetErrors(字符串属性名称);
//当特定属性的错误集已更改,或
//顶级错误已更改。
事件处理程序ErrorsChanged;
}
网络上有大量关于这个界面以及如何使用它的文档

如果您不想,您不必使用DataAnotations。但是如果您这样做了,您仍然可以使用
System.ComponentModel.DataAnnotations
命名空间中的
Validator
类来获取验证错误

如果您使ViewModel实现
INotifyDataError
,并且还具有一个属性(在ViewModel中)
bool正在验证
或类似的内容。然后,每次属性更改时,都会为所有要验证的属性触发ErrorsAnged事件(可以使用反射获取属性名称)。就这样

现在,您只需设置
IsValidating=false
,然后在请求保存时使用
IsValidating=true
显示错误


您可以做的另一件事(这将在Silverlight 3上起作用)是将ValidationSummary的可见性绑定到IsValidating属性(使用IValueConverter),然后从ViewModel中进行控制。

我猜您现在在应用程序中使用的是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;
}
公共接口INotifyDataErrorInfo
{
//如果对象至少有一个属性级别或顶级错误,则返回True。
布尔HasErrors{get;}
//返回所提供属性名称的当前属性级别错误集,或
//如果参数为null或空,则返回当前顶级错误。
IEnumerable GetErrors(字符串属性名称);
//当特定属性的错误集已更改,或
//顶级错误已更改。
事件处理程序ErrorsChanged;
}
网络上有大量关于这个界面以及如何使用它的文档

如果您不想,您不必使用DataAnotations。但是如果您这样做了,您仍然可以使用
System.ComponentModel.DataAnnotations
命名空间中的
Validator
类来获取验证错误

如果您使ViewModel实现
INotifyDataError
,并且还具有一个属性(在ViewModel中)
bool正在验证
或类似的内容。然后,每次属性更改时,都会为所有要验证的属性触发ErrorsAnged事件(可以使用反射获取属性名称)。就这样

现在,您只需设置
IsValidating=false
,然后在请求保存时使用
IsValidating=true
显示错误

您可以做的另一件事(,这将在Silverlight 3上起作用)是将ValidationSummary的可见性绑定到IsValidating属性(使用IValueConverter),然后从ViewModel进行控制