Как настроить сортировку категорий в 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
?
Ответы
Ответ 1
Если вы имеете в виду, что вам нужны категории, отсортированные по определенному (не алфавитному) пути, то нет - я не думаю, что вы можете это сделать. Возможно, вы захотите попробовать VisualHint - я ожидаю, что у этого есть это (так как вы можете использовать намного больше контроля).
Ответ 2
Я думаю, что эта ссылка полезна
http://bytes.com/groups/net-c/214456-q-ordering-sorting-category-text-propertygrid
Я не верю, что есть способ сделать это. Единственное, что я мог найдите, что указывает, что вы можете это сделать, это PropertySort имущество. Если вы установите его равным нулю, в нем указано, что свойства отображаются в порядке их получения из дескриптора типа. Вы, возможно способный создать дескриптор типа прокси между вашим объектом и свойствоgrid, которое затем возвращает не только свойства в правильном порядок, но свойства с категориями в том порядке, в котором вы хотите их в...
Ответ 3
Как @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
Небольшая вариация трюка '\ t', описанная выше, я просто попробовал ее с символами возврата каретки ('\ r'). Кажется, что он работает и позволяет избежать проблемы с подсказкой, вызванной дополнительным пространством, введенным вкладкой.