Laden...

[erledigt] Multiple Validation per Metadate geht nicht richtg

Letzter Beitrag vor 11 Jahren 2 Posts 650 Views
[erledigt] Multiple Validation per Metadate geht nicht richtg

es sieht so aus als ob es ein "feature" im IDataErrorInfo gibt

validation class

/// <summary>
    /// The class all validating ViewModel objects must inherit from. 
    /// </summary>
    public class VMValidation : VMWorkspace, IDataErrorInfo
    {
        private Dictionary<string, string> ErrorList = new Dictionary<string, string>();
    
        /// <summary>
        /// Gets a value indicating whether or not this domain object is valid. 
        /// </summary>
        public bool IsVailid
        {
            get { return (ErrorList.Count == 0) ? true : false; }
        }
    
        #region IDataErrorInfo
    
        /// <summary>
        /// Gets an error message indicating what is wrong with this domain object. 
        /// The default is an empty string ("").
        /// </summary>
        public string Error
        {
            get { return getErrors(); } // noch keine richtige methode für gefunden müsste so aber auch funktionieren
        }
    
        /// <summary>
        /// dies ist eine methode die durch einen Event (noch unbekannt welcher)
        /// ausgelöst wird und den Propertynamen schon mit übergeben bekommt
        /// </summary>
        /// <param name="propertyName">Name der Property z.B FirstName</param>
        /// <returns>The error message for the property. 
        /// The default is an empty string ("").</returns>
        public string this[string propertyName]
        {
            get { return OnValidate(propertyName); }
        }
    
        private string getErrors()
        {
            string Error = "";
            foreach (KeyValuePair<string, string> error in ErrorList)
            {
                Error += error.Value;
                Error += Environment.NewLine;
            }
    
            return Error;
        }
    
        /// <summary>
        /// Validates current instance properties using Data Annotations.
        /// </summary>
        /// <param name="propertyName">Name der Property</param>
        /// <returns>ErrorMsg</returns>
        protected virtual string OnValidate(string propertyName)
        {
            if (string.IsNullOrEmpty(propertyName))
                throw new ArgumentException("Invalid property name", propertyName);
    
            string error = string.Empty;
            var value = this.GetType().GetProperty(propertyName).GetValue(this, null);
            var results = new List<ValidationResult>(1);
    
            var context = new ValidationContext(this, null, null) { MemberName = propertyName };
    
            var result = Validator.TryValidateProperty(value, context, results);
    
            if (!result)
            {
                var validationResult = results.First();
                error = validationResult.ErrorMessage;
            }
            if (error.Length > 0)
            {
                if (!ErrorList.ContainsKey(propertyName))
                    ErrorList.Add(propertyName, error);
            }
            else
                if (ErrorList.ContainsKey(propertyName))
                    ErrorList.Remove(propertyName);
    
            return error;
        }
        #endregion //IDataErrorInfo
    }

ViewModel part mit MetaData für die Validirung

[Required]
    [RegularExpression(@"^[0-9''-'\s]$")]
    [Range(1,9999)] //<- wird anscheinend nicht benutzt da IsValid = true anstatt von false ist wenn man eine 0 eingibt
    public int MengeL
    {
        get { return myValue.Menge; }
        set
            {
               myValue.Menge = value;
               RaisePropertyChanged(() => Reg(() => MengeL));
               RaisePropertyChanged(() => Reg(() => dirtyMenge));
             }
     }

kann mir bitter einer sagen wo da der Fehler is den folgende Varianten funktionieren schonmal

[Required]
[RegularExpression(@"^[0-9''-'\s]$")]
[Required]
[Range(1,9999)]

ok hab das problem gelöst es lag an einer ganz anderen stelle

ValidatesOnDataErrors=True

hat einfach in der Defaultansicht der Zelle gefehlt damit wurde die validierung garnicht ausgelöst