Как настроить сортировку категорий в PropertyGrid?

как я могу настроить сортировку категорий в PropertyGrid?

если я установил одно из следующих...

propertyGrid.PropertySort = PropertySort.Categorized;
propertyGrid.PropertySort = PropertySort.CategorizedAlphabetical;

... затем категории будут расставлены в алфавитном порядке. ("Алфавитный", по-видимому, применяется к свойствам в каждой категории.) Если я использую PropertySort.NoSort, Я потеряю классификации.

я заполняю мой PropertyGrid С SelectObject, который довольно легко:

this.propertyGrid1.SelectedObject = options;

options является экземпляром класса с соответствующим оформлением свойства:

    [CategoryAttribute("Category Title"),
    DisplayName("Property Name"),
    Browsable(true),
    ReadOnly(false),
    BindableAttribute(true),
    DesignOnly(false),
    DescriptionAttribute("...")]
    public bool PropertyName {
        get {
            // ...
        }

        set {
            // ...
            this.OnPropertyChanged("PropertyName");
        }
    }

у меня есть несколько десятков свойств в полтора десятка категорий.

есть ли способ настроить порядок сортировки категорий, сохраняя при этом простоту использования с SelectedObject?

4 ответов


Если вы имеете в виду, что хотите отсортировать категории определенным (не алфавитным) способом, то нет-я не думаю, что вы можете это сделать. Возможно, вы захотите попробовать VisualHint - Я ожидаю, что у него есть это (так как вы можете захватить намного больше контроля).


Я думаю, что эта ссылка полезна http://bytes.com/groups/net-c/214456-q-ordering-sorting-category-text-propertygrid

Я не верю, что есть способ сделать это. Единственное, что я мог найдите, что указывает на то, что вы можете сделать это-PropertySort свойство. Если вы установите значение none, он говорит, что отображаются свойства в том порядке, в котором они получены из дескриптора типа. Ты можешь быть ... возможность создания прокси-типа дескриптор между вашим объектом и propertygrid, который затем вернет не только свойства в правильном порядок, но свойства с категориями в порядке, который вы хотите их...


как @Marc Gravel сказал в ответ, в рамках Нет ничего, что позволяет такое поведение. Любое решение будет взломом. С учетом сказанного, вы можете использовать решение, предложенное @Shahab в ответ как обходной путь, но это на самом деле не указывает на ваше намерение кому-либо поддерживать ваш код. Поэтому я думаю, что лучшее, что вы можете сделать, это создать пользовательский Attribute, который наследует от CategoryAttribute отрегулировать процесс для ты:

public class CustomSortedCategoryAttribute : CategoryAttribute
{
    private const char NonPrintableChar = '\t';

    public CustomSortedCategoryAttribute(   string category,
                                            ushort categoryPos,
                                            ushort totalCategories)
        : base(category.PadLeft(category.Length + (totalCategories - categoryPos),
                    CustomSortedCategoryAttribute.NonPrintableChar))
    {
    }
}

тогда вы можете использовать его как таковой

[CustomSortedCategory("Z Category",1,2)]
public string ZProperty {set;get;}
[CustomSortedCategory("A Category",2,2)]
public string AProperty {set;get;}

просто убедитесь, что вы выберите PropertyGrid ' s UseCompatibletextRendering свойство true чтобы удалить непечатаемые символы для вас и PropertySort значение Categorized или CategorizedAlphabetical и вы должны быть хорошо идти.


небольшая вариация трюка "\t", описанного выше, я просто попробовал его с символами возврата каретки ('\r'). Кажется, что это работает и избегает проблемы всплывающей подсказки, вызванной дополнительным пространством, введенным вкладкой.