Как настроить сортировку категорий в 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'). Кажется, что это работает и избегает проблемы всплывающей подсказки, вызванной дополнительным пространством, введенным вкладкой.