private static void CopyCategoryFrom(GridEntryCollection <CategoryItem> oldValue, IEnumerable <CategoryItem> newValue)
        {
            foreach (var category in newValue)
            {
                var prev = oldValue[category.Name];
                if (prev == null)
                {
                    continue;
                }

                category.IsExpanded = prev.IsExpanded;
            }
        }
        internal void DoReload()
        {
            if (SelectedObject == null)
            {
                Categories = new GridEntryCollection <CategoryItem>();
                Properties = new GridEntryCollection <PropertyItem>();
            }
            else
            {
                // Collect BrowsableCategoryAttribute items
                var categoryAttributes = PropertyGridUtils.GetAttributes <BrowsableCategoryAttribute>(SelectedObject);
                browsableCategories = new List <BrowsableCategoryAttribute>(categoryAttributes);

                // Collect BrowsablePropertyAttribute items
                var propertyAttributes = PropertyGridUtils.GetAttributes <BrowsablePropertyAttribute>(SelectedObject);
                browsableProperties = new List <BrowsablePropertyAttribute>(propertyAttributes);

                // Collect categories and properties
                var properties = CollectProperties(SelectedObjects);

                // TODO: This needs more elegant implementation
                var categories = new GridEntryCollection <CategoryItem>(CollectCategories(properties));
                if (Categories != null && Categories.Count > 0)
                {
                    CopyCategoryFrom(Categories, categories);
                }

                // Fetch and apply category orders
                var categoryOrders = PropertyGridUtils.GetAttributes <CategoryOrderAttribute>(SelectedObject);
                foreach (var orderAttribute in categoryOrders)
                {
                    var category = categories[orderAttribute.Category];
                    // don't apply Order if it was applied before (Order equals zero or more),
                    // so the first discovered Order value for the same category wins
                    if (category != null && category.Order < 0)
                    {
                        category.Order = orderAttribute.Order;
                    }
                }

                Categories = categories; //new CategoryCollection(CollectCategories(properties));
                Properties = new GridEntryCollection <PropertyItem>(properties);
            }
        }