using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using AssistClient.UI; namespace AssistClient.UI.PropExtend { public class PropertySorter : ExpandableObjectConverter { #region Methods public override bool GetPropertiesSupported(ITypeDescriptorContext context) { return true; } public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) { // // This override returns a list of properties in order // PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(value, attributes); ArrayList orderedProperties = new ArrayList(); foreach (PropertyDescriptor pd in pdc) { Attribute attribute = pd.Attributes[typeof(PropertyOrderAttribute)]; if (attribute != null) { // // If the attribute is found, then create an pair object to hold it // PropertyOrderAttribute poa = (PropertyOrderAttribute)attribute; orderedProperties.Add(new PropertyOrderPair(pd.Name, poa.Order)); } else { // // If no order attribute is specifed then given it an order of 0 // orderedProperties.Add(new PropertyOrderPair(pd.Name, 0)); } } // // Perform the actual order using the value PropertyOrderPair classes // implementation of IComparable to sort // orderedProperties.Sort(); // // Build a string list of the ordered names // ArrayList propertyNames = new ArrayList(); foreach (PropertyOrderPair pop in orderedProperties) { propertyNames.Add(pop.Name); } // // Pass in the ordered list for the PropertyDescriptorCollection to sort by // return pdc.Sort((string[])propertyNames.ToArray(typeof(string))); } #endregion } }