Как настроить сортировку категорий в PropertyGrid? - PullRequest
20 голосов
/ 05 мая 2009

Как настроить сортировку категорий в 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 ]

21 голосов
/ 15 июня 2009

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

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

16 голосов
/ 30 января 2014

Как @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 UseCompatibletextRendering установлено значение true, чтобы исключить непечатаемые для вас символы, а для PropertySort установлено значение Categorized или CategorizedAlphabetical, и вы хорошо идти.

4 голосов
/ 05 мая 2009

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

3 голосов
/ 04 июня 2015

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

...