コード例 #1
0
 internal PropertyInfoBinding(IControl control,
                              IControlDescriptor ctrlDesc, IList <IControlDescriptor> parents, PropertyInfoMetadata metadata)
     : base(control)
 {
     ControlDescriptor = ctrlDesc;
     m_Parents         = parents;
     m_Metadata        = metadata;
 }
コード例 #2
0
 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;
 }
コード例 #3
0
        /// <summary>
        /// Биндинг decimal бокса.
        /// </summary>
        private IUserControlController BindMoneyBox(PropertyInfo propertyInfo, IControlDescriptor control)
        {
            var controller = new MoneyBoxController();

            controller.SetView((MoneyBoxControl)control);

            ProcessCommon(controller.Model, propertyInfo);

            return(controller);
        }
コード例 #4
0
        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> >();
        }
コード例 #5
0
        /// <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);
        }
コード例 #6
0
        /// <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
        }
コード例 #7
0
        /// <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);
        }
コード例 #8
0
        /// <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);
        }
コード例 #9
0
        /// <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);
        }
コード例 #10
0
        /// <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);
            }
        }
コード例 #11
0
ファイル: TypeDataBinder.cs プロジェクト: EddyAlleman/xcad
        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));
        }
コード例 #12
0
        /// <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);
        }
コード例 #13
0
 public ControlDescriptorWrapper(IControlDescriptor baseCtrlDesc, PropertyInfo prpInfo)
 {
     m_BaseCtrlDesc = baseCtrlDesc;
     m_PrpInfo      = prpInfo;
 }
コード例 #14
0
ファイル: TypeDataBinder.cs プロジェクト: EddyAlleman/xcad
        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);
        }
コード例 #15
0
ファイル: TypeDataBinder.cs プロジェクト: EddyAlleman/xcad
        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);
                        }
                    }
                }
            }
        }
コード例 #16
0
 public MissingMetadataException(object tag, IControlDescriptor ctrlDesc)
     : base($"Failed to find the metadata '{tag?.ToString()}' for {ctrlDesc.DisplayName}")
 {
 }