Validation Silverlight 5验证问题

Validation Silverlight 5验证问题,validation,textbox,silverlight-5.0,Validation,Textbox,Silverlight 5.0,我正在尝试使用silverlight中的验证来验证项目的数据条目 这就是结果 正如您所看到的,几乎所有文本框的边框都是红色的,实际上,在这种情况下,它们中没有一个应该是红色的!在所有的工具提示中都有相同的信息 这里有我在表单的数据上下文中使用的对象的属性 private int matricola; public int Matricola { get { return matricola; } set {

我正在尝试使用silverlight中的验证来验证项目的数据条目

这就是结果

正如您所看到的,几乎所有文本框的边框都是红色的,实际上,在这种情况下,它们中没有一个应该是红色的!在所有的工具提示中都有相同的信息

这里有我在表单的数据上下文中使用的对象的属性

    private int matricola;
    public int Matricola
    {
        get { return matricola; }
        set 
        {
            ValidateRequiredInt("Matricola", value, "Inserire un numero");
            matricola = value;
            OnNotifyPropertyChanged("Matricola");
        }
    }

    private String cognome;
    public String Cognome
    {
        get { return cognome; }
        set 
        {
            ValidateRequiredString("Cognome", value, "Inserire cognome");
            cognome = value;
            OnNotifyPropertyChanged("Cognome");
        }
    }

    private String nome;
    public String Nome
    {
        get { return nome; }
        set 
        {
            ValidateRequiredString("Nome", value, "Inserire nome");
            nome = value;
            OnNotifyPropertyChanged("Nome");
        }
    }

    private String codiceUtente;
    public String CodiceUtente
    {
        get { return codiceUtente; }
        set 
        {
            ValidateRequiredString("CodiceUtente", value, "Inserire codice utente");
            codiceUtente = value;
            OnNotifyPropertyChanged("CodiceUtente");
        }
    }

    private String password;
    public String Password
    {
        get { return password; }
        set 
        {
            ValidateRequiredString("Password", value, "Inserire password");
            password = value;
            OnNotifyPropertyChanged("Password");
        }
    }

    private int? idOrario;
    public int? IdOrario
    {
        get { return idOrario; }
        set { idOrario = value; }
    }

    private DateTime? dataAssunzione;
    public DateTime? DataAssunzione
    {
        get { return dataAssunzione; }
        set 
        {
            if (value != null)
            {
                ValidateDateTime("DataAssunzione", (DateTime)value, "Immettere una data corretta");
                if (((DateTime)value).Year == 1 && ((DateTime)value).Month == 1 && ((DateTime)value).Day == 1)
                {
                    dataAssunzione = null;
                }
                else
                {
                    dataAssunzione = value;
                }
                OnNotifyPropertyChanged("DataAssunzione");
            }
            else
            {
                dataAssunzione = null;
            }
        }
    }

    private DateTime? dataLicenziamento;
    public DateTime? DataLicenziamento
    {
        get { return dataLicenziamento; }
        set 
        {
            if (value != null)
            {
                ValidateDateTime("DataLicenziamento", (DateTime)value, "Immettere una data corretta");
                if (((DateTime)value).Year == 1 && ((DateTime)value).Month == 1 && ((DateTime)value).Day == 1)
                {
                    dataLicenziamento = null;
                }
                else
                {
                    dataLicenziamento = value;
                }
                OnNotifyPropertyChanged("DataLicenziamento");
            }
            else
            {
                dataLicenziamento = null;
            }
        }
    }

    private int idGruppoAnag;
    public int IdGruppoAnag
    {
        get { return idGruppoAnag; }
        set { idGruppoAnag = value; }
    }

    private int? costoOrario;
    public int? CostoOrario
    {
        get { return costoOrario; }
        set 
        {
            if (value != null)
            {
                ValidateInt("CostoOrario", (int)value, "Immettere un numero o lasciare il campo vuoto");
                if (value == 0 || value == -1)
                {
                    costoOrario = null;
                }
                else
                {
                    costoOrario = value;
                }
                OnNotifyPropertyChanged("CostoOrario");
            }
            else
            {
                costoOrario = null;
            }
        }
    }
这些是用于验证的方法

    protected bool ValidateRequiredInt(string propName, int value, string errorText)
    {
        if (DataErrors.ContainsKey(propName))
        {
            DataErrors[propName].Remove(errorText);
        }

        if (value == 0 || value == -1)
        {
            AddError(propName, errorText);
            return false;
        }
        OnErrorsChanged(propName);
        return true;
    }

    //validazione dei campi che richiedono numeri interi nullable
    protected bool ValidateInt(string propName, int value, string errorText)
    {
        if (DataErrors.ContainsKey(propName))
        {
            DataErrors[propName].Remove(errorText);
        }
        if (value == 0)
        {
            AddError(propName, errorText);
            return false;
        }
        OnErrorsChanged(propName);
        return true;
    }

    //validazione dei campi che richiedono stringhe
    protected bool ValidateRequiredString(string propName, string value, string errorText)
    {
        //Clear any existing errors since we're revalidating now
        if (DataErrors.ContainsKey(propName))
        {
            DataErrors[propName].Remove(errorText);
        }
        if (string.IsNullOrEmpty(value))
        {
            AddError(propName, errorText);
            return false;
        }
        OnErrorsChanged(propName);
        return true;
    }

    protected bool ValidateDateTime(string propName, DateTime value, string errorText)
    {
        //Clear any existing errors since we're revalidating now
        if (DataErrors.ContainsKey(propName))
        {
            DataErrors[propName].Remove(errorText);
        }
        if (value.Year == 9999 && value.Month == 12 && value.Day == 31)
        {
            AddError(propName, errorText);
            return false;
        }
        OnErrorsChanged(propName);
        return true;
    }
我还在两个数据文本框中使用dataconverter,在matricola和costo文本框中使用numberconverter,作为本地资源,我可以说它们工作得很好


我错过了什么

如何实现INotifyDataErrorInfo

在视图模型基类中:

    public abstract class BaseViewModel : INotifyPropertyChanged, INotifyDataErrorInfo
{
    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

#endregion

    #region INotifyDataErrorInfo Members

    public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

    public System.Collections.IEnumerable GetErrors(string propertyName)
    {   
    ....
    }

    public System.Collections.IEnumerable GetErrors()
    {
    ...
    }

//Plus methods to push errors into an underlying error dictionary used by the above error get methods
}
方法whcih将其包装起来。 清除错误可以通过将null传递给此方法和/或使用单独的

ClearErrorsProPropertyString propName

方法

SetErrorForProperty(string propName, object error)