//--------------------------------------------------------------------------------------------------------- /// <summary> /// Конструктор инициализирует объект класса указанными параметрами /// </summary> /// <param name="property_info">Метаданные свойства</param> /// <param name="property_desc">Описание свойства</param> /// <param name="property_type">Допустимый тип свойства</param> //--------------------------------------------------------------------------------------------------------- public CPropertyModelBase(PropertyInfo property_info, CPropertyDesc property_desc, TPropertyType property_type) { mInfo = property_info; mPropertyType = property_type; ApplyInfoFromDecs(property_desc); // Имеет преимущество ApplyInfoFromAttributes(); }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Получение данных описание свойства с помощью внешнего описания свойства /// </summary> /// <param name="desc">Описание свойства</param> //--------------------------------------------------------------------------------------------------------- protected void ApplyInfoFromDecs(CPropertyDesc desc) { if (desc != null) { if (String.IsNullOrEmpty(desc.DisplayName) == false) { mDisplayName = desc.DisplayName; } if (String.IsNullOrEmpty(desc.Description) == false) { mDescription = desc.Description; } if (desc.PropertyOrder != -1) { mPropertyOrder = desc.PropertyOrder; } if (String.IsNullOrEmpty(desc.Category) == false) { mCategory = desc.Category; } if (desc.CategoryOrder != -1) { mCategoryOrder = desc.CategoryOrder; } if (desc.IsReadOnly) { mIsReadOnly = true; } if (desc.DefaultValue != null) { mDefaultValue = desc.DefaultValue; } if (desc.ListValues != null) { mListValues = desc.ListValues; } } }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Заполнить контекстное меню списком допустимых значений /// </summary> /// <param name="context_menu">Контекстное меню</param> //--------------------------------------------------------------------------------------------------------- public virtual void AssingContenxMenuListValues(ContextMenu context_menu) { if (IsListValues) { IEnumerable enumerable = CPropertyDesc.GetValue(mListValues, mListValuesMemberName, mListValuesMemberType, mInstance) as IEnumerable; if (context_menu != null && enumerable != null) { context_menu.Items.Clear(); foreach (var item in enumerable) { context_menu.Items.Add(new MenuItem() { Header = item, Tag = this }); } } } }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Проверка на значение что оно из списка значений /// </summary> //--------------------------------------------------------------------------------------------------------- public override void CheckIsValueFromList() { mIsValueFromList = false; if (IsListValues) { IEnumerable enumerable = CPropertyDesc.GetValue(mListValues, mListValuesMemberName, mListValuesMemberType, mInstance) as IEnumerable; foreach (var item in enumerable) { if (item.Equals(Value)) { mIsValueFromList = true; break; } } } NotifyPropertyChanged(PropertyArgsIsValueFromList); }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Конструктор инициализирует объект класса указанными параметрами /// </summary> /// <param name="property_info">Метаданные свойства</param> /// <param name="property_desc">Описание свойства</param> //--------------------------------------------------------------------------------------------------------- public CPropertyModelEnum(PropertyInfo property_info, CPropertyDesc property_desc) : base(property_info, property_desc, TPropertyType.Enum) { mEnumValues = new ArrayList(Enum.GetValues(property_info.PropertyType)); mEnumNames = new List <String>(Enum.GetNames(property_info.PropertyType)); }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Добавление модели свойства для числовых типов /// </summary> /// <param name="property_info">Метаданные свойства</param> /// <param name="property_desc">Описание свойства</param> //--------------------------------------------------------------------------------------------------------- protected void AddModelPropertyNumeric(PropertyInfo property_info, CPropertyDesc property_desc) { switch (Type.GetTypeCode(property_info.PropertyType)) { case TypeCode.Empty: break; case TypeCode.Object: break; case TypeCode.DBNull: break; case TypeCode.Boolean: break; case TypeCode.Char: mProperties.Add(new PropertyModelRange <Char>(property_info, property_desc)); break; case TypeCode.SByte: mProperties.Add(new PropertyModelRange <SByte>(property_info, property_desc)); break; case TypeCode.Byte: mProperties.Add(new PropertyModelRange <Byte>(property_info, property_desc)); break; case TypeCode.Int16: mProperties.Add(new PropertyModelRange <Int16>(property_info, property_desc)); break; case TypeCode.UInt16: mProperties.Add(new PropertyModelRange <UInt16>(property_info, property_desc)); break; case TypeCode.Int32: mProperties.Add(new PropertyModelRange <Int32>(property_info, property_desc)); break; case TypeCode.UInt32: mProperties.Add(new PropertyModelRange <UInt32>(property_info, property_desc)); break; case TypeCode.Int64: mProperties.Add(new PropertyModelRange <Int64>(property_info, property_desc)); break; case TypeCode.UInt64: mProperties.Add(new PropertyModelRange <UInt64>(property_info, property_desc)); break; case TypeCode.Single: mProperties.Add(new PropertyModelRange <Single>(property_info, property_desc)); break; case TypeCode.Double: mProperties.Add(new PropertyModelRange <Double>(property_info, property_desc)); break; case TypeCode.Decimal: mProperties.Add(new PropertyModelRange <Decimal>(property_info, property_desc)); break; case TypeCode.DateTime: break; case TypeCode.String: break; default: break; } }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Добавление модели свойств /// </summary> //--------------------------------------------------------------------------------------------------------- protected void AddModelProperties() { // Получаем список свойств PropertyInfo[] props = mSelectedObject.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public).OrderBy(x => x.MetadataToken).ToArray(); for (Int32 i = 0; i < props.Length; i++) { PropertyInfo property_info = props[i]; Type type = property_info.PropertyType; // Проверка на видимость свойства BrowsableAttribute browsable_attribute = property_info.GetAttribute <BrowsableAttribute>(); if (browsable_attribute != null && browsable_attribute.Browsable == false) { continue; } // Получаем описание свойства CPropertyDesc property_desc = GetPropertyDesc(property_info); // Проверка на видимость if (property_desc != null && property_desc.IsHideInspector) { continue; } // Логическое свойство if (type.Name == nameof(Boolean)) { mProperties.Add(new PropertyModel <Boolean>(property_info, property_desc, TPropertyType.Boolean)); continue; } // Перечисление if (type.IsEnum) { mProperties.Add(new CPropertyModelEnum(property_info, property_desc)); continue; } // Числовое свойство if (type.IsNumericType()) { AddModelPropertyNumeric(property_info, property_desc); continue; } if (type.Name == nameof(TMeasurementValue)) { mProperties.Add(new PropertyModelMeasurementValue(property_info, property_desc)); continue; } if (type.Name == nameof(DateTime)) { mProperties.Add(new PropertyModel <DateTime>(property_info, property_desc, TPropertyType.DateTime)); continue; } if (type.Name == nameof(String)) { mProperties.Add(new PropertyModel <String>(property_info, property_desc, TPropertyType.String)); continue; } } }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Конструктор инициализирует объект класса указанными параметрами /// </summary> /// <param name="property_info">Метаданные свойства</param> /// <param name="property_desc">Описание свойства</param> /// <param name="property_type">Допустимый тип свойства</param> //--------------------------------------------------------------------------------------------------------- public PropertyModel(PropertyInfo property_info, CPropertyDesc property_desc, TPropertyType property_type) : base(property_info, property_desc, property_type) { }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Конструктор инициализирует объект класса указанными параметрами /// </summary> /// <param name="property_info">Метаданные свойства</param> /// <param name="property_desc">Описание свойства</param> //--------------------------------------------------------------------------------------------------------- public PropertyModelMeasurementValue(PropertyInfo property_info, CPropertyDesc property_desc) : base(property_info, property_desc, TPropertyType.Measurement) { GetInfoFromAttributesRange(); }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Конструктор инициализирует объект класса указанными параметрами /// </summary> /// <param name="property_info">Метаданные свойства</param> /// <param name="property_desc">Описание свойства</param> //--------------------------------------------------------------------------------------------------------- public PropertyModelRange(PropertyInfo property_info, CPropertyDesc property_desc) : base(property_info, property_desc, TPropertyType.Numeric) { GetInfoFromAttributesRange(); }