internal PropertyInfoBinding(IControl control, IControlDescriptor ctrlDesc, IList <IControlDescriptor> parents, PropertyInfoMetadata metadata) : base(control) { ControlDescriptor = ctrlDesc; m_Parents = parents; m_Metadata = metadata; }
internal PropertyInfoBinding(IControl control, IControlDescriptor ctrlDesc, IList <IControlDescriptor> parents, PropertyInfoMetadata[] metadata, IContextProvider contextProvider) : base(control) { ControlDescriptor = ctrlDesc; m_Parents = parents; m_Metadata = metadata; m_ContextProvider = contextProvider; m_ContextProvider.ContextChanged += OnContextChanged; }
/// <summary> /// Биндинг decimal бокса. /// </summary> private IUserControlController BindMoneyBox(PropertyInfo propertyInfo, IControlDescriptor control) { var controller = new MoneyBoxController(); controller.SetView((MoneyBoxControl)control); ProcessCommon(controller.Model, propertyInfo); return(controller); }
internal AttributeSet(int ctrlId, string ctrlName, string desc, Type contextType, object tag, IControlDescriptor ctrlDesc = null) { Id = ctrlId; Name = ctrlName; Description = desc; ContextType = contextType; ControlDescriptor = ctrlDesc; Tag = tag; m_Attributes = new Dictionary <Type, List <IAttribute> >(); }
/// <summary> /// Биндинг check бокса. /// </summary> private IUserControlController BindCheckBox(PropertyInfo propertyInfo, IControlDescriptor control) { var controller = new CheckBoxController(); controller.SetView((CheckBoxControl)control); ProcessCommon(controller.Model, propertyInfo); ProcessFocusable(control, propertyInfo); return(controller); }
/// <summary> /// Обработка фокусных контролов. /// </summary> /// <param name="control">Контрол для обработки.</param> /// <param name="propertyInfo">Информация о свойстве.</param> private void ProcessFocusable(IControlDescriptor control, PropertyInfo propertyInfo) { var focusable = control as IFocusable; if (focusable != null) { var attr = GetAttribute <TabStepAttribute>(propertyInfo); if (attr != null) { _tabControlManager.Add(focusable, attr.Step); } //if } //if }
/// <summary> /// Биндинг даты. /// </summary> private IUserControlController BindDateBox(PropertyInfo propertyInfo, IControlDescriptor control) { var controller = new DateBoxController(); controller.SetView((DateBoxControl)control); ProcessCommon(controller.Model, propertyInfo); var type = propertyInfo.PropertyType; controller.Model.AllowNull = type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable <>); return(controller); }
/// <summary> /// Биндинг масочного бокса. /// </summary> private IUserControlController BindMaskedTextBox(PropertyInfo propertyInfo, IControlDescriptor control) { var controller = new MaskedTextBoxController(); controller.SetView((MaskedTextBoxControl)control); ProcessCommon(controller.Model, propertyInfo); var attr = GetAttribute <TextBoxMaskAttrubute>(propertyInfo); if (attr != null) { controller.Model.Mask = attr.Mask; } return(controller); }
/// <summary> /// Биндинг текстового бокса. /// </summary> private IUserControlController BindTextBox(PropertyInfo propertyInfo, IControlDescriptor control) { var controller = new TextBoxController(); controller.SetView((TextBoxControl)control); ProcessCommon(controller.Model, propertyInfo); var attr = GetAttribute <RegexValueAttribute>(propertyInfo); if (attr != null) { controller.Model.RegexText = attr.Regex; } return(controller); }
/// <summary> /// Привязывает контрол к соответствующей модели. /// </summary> /// <param name="propertyInfo">Информация по связанному свойству.</param> /// <param name="control">Контрол.</param> private void BindControl(PropertyInfo propertyInfo, IControlDescriptor control) { IUserControlController controller = null; switch (control.ControlType) { case ControlType.CheckBoxControl: controller = BindCheckBox(propertyInfo, control); break; case ControlType.ComboBoxControl: controller = BindComboBox(propertyInfo, control); break; case ControlType.DateBoxControl: controller = BindDateBox(propertyInfo, control); break; case ControlType.MaskedTextBoxControl: controller = BindMaskedTextBox(propertyInfo, control); break; case ControlType.MoneyBoxControl: controller = BindMoneyBox(propertyInfo, control); break; case ControlType.TextBoxControl: controller = BindTextBox(propertyInfo, control); break; case ControlType.TextBlockControl: break; } if (controller != null) { ProcessFocusable(control, propertyInfo); _modelControllers.Add(controller); } }
private IAttributeSet GetAttributeSet(IControlDescriptor prp, int ctrlId) { string name; string desc; object tag; var type = prp.DataType; var typeAtts = (type.GetCustomAttributes(true) ?? new object[0]).OfType <IAttribute>(); var prpAtts = prp.Attributes ?? new IAttribute[0]; name = prp.DisplayName; desc = prp.Description; tag = prpAtts.OfType <IControlTagAttribute>().FirstOrDefault()?.Tag; if (string.IsNullOrEmpty(name)) { name = prp.Name; } return(CreateAttributeSet(ctrlId, name, desc, type, prpAtts.Union(typeAtts).ToArray(), tag, prp)); }
/// <summary> /// Биндинг комбобокса. /// </summary> private IUserControlController BindComboBox(PropertyInfo propertyInfo, IControlDescriptor control) { ComboBoxController controller = null; var attr = GetAttribute <ComboBoxControlAttribute>(propertyInfo); if (attr != null) { var instance = Core.ClientCore.Instance.CreateInstance <IComboBoxItemController>(attr.ControllerType); if (instance != null) { instance.SetView((ComboBoxControl)control, attr.AllowNull, attr.ShowNullValue); controller = instance.GetController(); ProcessCommon(controller.Model, propertyInfo); ProcessFocusable(control, propertyInfo); _comboBoxItems.Add(propertyInfo.Name, instance); } } return(controller); }
public ControlDescriptorWrapper(IControlDescriptor baseCtrlDesc, PropertyInfo prpInfo) { m_BaseCtrlDesc = baseCtrlDesc; m_PrpInfo = prpInfo; }
private IAttributeSet CreateAttributeSet(int ctrlId, string ctrlName, string desc, Type boundType, IAttribute[] atts, object tag, IControlDescriptor ctrlDescriptor = null) { var attsSet = new AttributeSet(ctrlId, ctrlName, desc, boundType, tag, ctrlDescriptor); if (atts?.Any() == true) { foreach (var att in atts) { attsSet.Add(att); } } return(attsSet); }
private void TraverseType <TDataModel>(Type type, List <IControlDescriptor> parents, CreateBindingControlDelegate ctrlCreator, CreateDynamicControlsDelegate dynCtrlDescCreator, IGroup parentCtrl, IReadOnlyDictionary <object, PropertyInfoMetadata> metadata, List <IBinding> bindings, IRawDependencyGroup dependencies, IContextProvider contextProvider, ref int nextCtrlId) { foreach (var prp in type.GetProperties().OrderBy(p => { var orderAtt = p.GetCustomAttribute <OrderAttribute>(); if (orderAtt != null) { return(orderAtt.Order); } else { return(0); } })) { IControlDescriptor[] ctrlDescriptors; var dynCtrlAtt = prp.GetCustomAttribute <DynamicControlsAttribute>(); if (dynCtrlAtt != null) { if (dynCtrlDescCreator != null) { ctrlDescriptors = dynCtrlDescCreator.Invoke(dynCtrlAtt.Tag) ?? new IControlDescriptor[0]; } else { throw new DynamicControlHandlerMissingException(prp); } ctrlDescriptors = ctrlDescriptors.Select(d => new ControlDescriptorWrapper(d, prp)).ToArray(); } else { ctrlDescriptors = new IControlDescriptor[] { new PropertyInfoControlDescriptor(prp) }; } foreach (var ctrlDesc in ctrlDescriptors) { var prpType = ctrlDesc.DataType; var atts = GetAttributeSet(ctrlDesc, nextCtrlId); if (!atts.Has <IIgnoreBindingAttribute>() && !atts.Has <IMetadataAttribute>()) { var prpMetadata = new List <PropertyInfoMetadata>(); if (atts.Has <IHasMetadataAttribute>()) { var metadataTagsAtts = atts.GetAll <IHasMetadataAttribute>(); foreach (var metadataTagAtts in metadataTagsAtts) { if (metadataTagAtts.HasMetadata) { var metadataTag = metadataTagAtts.MetadataTag; if (metadataTag == null) { throw new NullReferenceException($"Metadata tag is not set for {ctrlDesc.Name}"); } if (metadata.TryGetValue(metadataTag, out PropertyInfoMetadata md)) { prpMetadata.Add(md); } else { throw new MissingMetadataException(metadataTag, ctrlDesc); } } } } var prpMetadataArr = prpMetadata.ToArray(); int numberOfUsedIds; var ctrl = ctrlCreator.Invoke(prpType, atts, parentCtrl, prpMetadataArr, out numberOfUsedIds); nextCtrlId += numberOfUsedIds; var binding = new PropertyInfoBinding <TDataModel>(ctrl, ctrlDesc, parents, prpMetadataArr, contextProvider); bindings.Add(binding); if (atts.Has <IControlTagAttribute>()) { var tag = atts.Get <IControlTagAttribute>().Tag; dependencies.RegisterBindingTag(binding, tag); } if (atts.Has <IDependentOnAttribute>()) { foreach (var depAtt in atts.GetAll <IDependentOnAttribute>()) { if (depAtt.Dependencies?.Any() == true) { dependencies.RegisterDependency(binding, depAtt.Dependencies, depAtt.DependencyHandler); } } } if (atts.Has <IDependentOnMetadataAttribute>()) { var depAtt = atts.Get <IDependentOnMetadataAttribute>(); var depMds = depAtt.Dependencies.Select(t => { if (!metadata.TryGetValue(t, out PropertyInfoMetadata md)) { throw new MissingMetadataException(t, ctrlDesc); } return(md); }).ToArray(); dependencies.RegisterMetadataDependency(ctrl, depMds, depAtt.DependencyHandler); } var isGroup = ctrl is IGroup; if (isGroup) { var grpParents = new List <IControlDescriptor>(parents); grpParents.Add(ctrlDesc); TraverseType <TDataModel>(prpType, grpParents, ctrlCreator, dynCtrlDescCreator, ctrl as IGroup, metadata, bindings, dependencies, contextProvider, ref nextCtrlId); } } } } }
public MissingMetadataException(object tag, IControlDescriptor ctrlDesc) : base($"Failed to find the metadata '{tag?.ToString()}' for {ctrlDesc.DisplayName}") { }