0

Silverlight の検証を使用して、プロジェクトのデータ エントリを検証しようとしています。

これが結果です

http://imageshack.us/photo/my-images/842/imagineleb.png/

ほとんどすべてのテキストボックスの境界線が赤であることがわかるように、実際には、この場合、どれも赤くすべきではありません! そして、すべてのツールチップに同じメッセージがあります。

フォームのデータ コンテキストで使用するオブジェクトのプロパティがあります。

    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;
    }

また、2 つの「データ」テキスト ボックスで dataconverter を使用し、matricola と costo テキスト ボックスで numberconverter をローカル リソースとして使用しており、正常に動作していると言えます。

私は何かが欠けていますか?

4

1 に答える 1

0

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
}

これを拡張すると、すべてのビューモデルの再利用可能な基本クラスが得られます。適切なセッターでプロパティを検証します。検証に失敗した場合は、プロパティ名をキーとするエラー ディクショナリにエラーをプッシュします。検証が成功した場合は、プロパティのディクショナリから検証エラー (存在する場合) を削除します。

ディクショナリを変更するときは ErrorsChanged イベントを発生させる必要がありますが、これは保護された

SetErrorForProperty(string propName, object error)

これをまとめるメソッド。エラーをクリアするには、このメソッドに null を渡すか、別の

ClearErrorsFroProperty(string propName)

方法。

于 2012-04-27T20:38:31.933 に答える