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

StackOverflow https://stackoverflow.com/questions/823327

  •  05-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

Другие советы

Я думаю, что эта ссылка полезна http://bytes.com/groups/ нетто-с / 214456-д-упорядочивание-сортировочной-категория-текст 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;}

Просто убедитесь, что для свойства UseCompatibletextRendering true PropertyGrid установлено значение true , чтобы удалить непечатные символы для вас и для < Для code> PropertySort установлено значение Категоризованный или Категоризованный алфавитный , и вам следует идти дальше.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top