/// <summary> /// Does validate. /// </summary> /// <param name="value">Value to validation.</param> /// <param name="culture">Culture info.</param> /// <param name="context">Cell validation context.</param> /// <returns>Validation result.</returns> public override ValidationResult Validate(object value, CultureInfo culture, CellValidationContext context) { bool isValid = true; string newValue = value as string; IVrpSolver solver = App.Current.Solver; NetworkDescription networkDescription = solver.NetworkDescription; if (newValue != null && networkDescription != null) { var wrapper = context.DataItem as RestrictionDataWrapper; ICollection <NetworkAttribute> networkAttributes = networkDescription.NetworkAttributes; foreach (NetworkAttribute attribute in networkAttributes) { // If it is current attribute - find parameter to validate. if (wrapper.Restriction.Name.Equals(attribute.Name, StringComparison.OrdinalIgnoreCase)) { Debug.Assert(null != attribute.Parameters); NetworkAttributeParameter[] parameters = attribute.Parameters.ToArray(); int paramIndex = Parameters.GetIndex(context.Cell.FieldName); // If parameter index was found. if (paramIndex != -1) { var parameter = wrapper.Parameters[paramIndex]; // Get corresponding network attribute parameter // and check that value can be converted to parameter type. NetworkAttributeParameter param = parameters.FirstOrDefault( x => x.Name == parameter.Name); // If string is not empty or if parameter doesn't accept empty string - // try to convert value. if ((string)value != string.Empty || !param.IsEmptyStringValid) { try { Convert.ChangeType(value, param.Type); // NOTE: ignore result } catch { isValid = false; } } } break; } } } return((isValid) ? ValidationResult.ValidResult : new ValidationResult(false, App.Current.FindString("NotValidValueText"))); }
/// <summary> /// Inits grid source. /// </summary> /// <param name="maxParametersCount">Maximum number of attribute parameters.</param> /// <param name="collectionSource">Data grid collection source.</param> private void _InitGridSource(int maxParametersCount, DataGridCollectionViewSource collectionSource) { IVrpSolver solver = App.Current.Solver; SolverSettings solverSettings = solver.SolverSettings; NetworkDescription networkDescription = solver.NetworkDescription; ICollection <Restriction> restrictions = solverSettings.Restrictions; var restrictionWrappers = new List <RestrictionDataWrapper>(); var networkAttributes = networkDescription.NetworkAttributes; foreach (NetworkAttribute attribute in networkAttributes) { if (attribute.UsageType == NetworkAttributeUsageType.Restriction) { Restriction restriction = _FindRestriction(attribute.Name, restrictions); if (restriction.IsEditable) { Debug.Assert(null != attribute.Parameters); // Create collection of all non "restriction usage" attribute parameters. IList <NetworkAttributeParameter> attrParams; if (attribute.RestrictionUsageParameter != null) { attrParams = attribute.Parameters.Where( param => param.Name != attribute.RestrictionUsageParameter.Name).ToList(); } else { attrParams = attribute.Parameters.ToList(); } var parameters = new Parameters(maxParametersCount); for (int index = 0; index < maxParametersCount; ++index) { string value = null; if (index < attrParams.Count()) { NetworkAttributeParameter param = attrParams.ElementAt(index); value = _GetParameterValue(attribute.Name, param.Name, solverSettings); parameters[index] = new Parameter(param.Name, value); } else { parameters[index] = new Parameter(); } } // Create wrapper for restriction. var wrapper = new RestrictionDataWrapper(restriction.IsEnabled, restriction.NetworkAttributeName, restriction.Description, parameters); // If attribute has restriction usage parameter - add this parameter // to wrapper. if (attribute.RestrictionUsageParameter != null) { var restrictionUsageParameterValue = _GetParameterValue(attribute.Name, attribute.RestrictionUsageParameter.Name, solverSettings); var restrictionParameter = new Parameter(attribute.RestrictionUsageParameter.Name, restrictionUsageParameterValue); wrapper.RestrictionUsageParameter = restrictionParameter; } restrictionWrappers.Add(wrapper); } } } collectionSource.Source = restrictionWrappers; }