Como posso personalizar a classificação de categorias em um PropertyGrid?
-
05-07-2019 - |
Pergunta
Como posso personalizar a classificação de categorias em um PropertyGrid
?
Se eu definir um dos seguintes ...
propertyGrid.PropertySort = PropertySort.Categorized;
propertyGrid.PropertySort = PropertySort.CategorizedAlphabetical;
... Então as categorias serão alfabetizadas. ("Alfabético" parece aplicar -se às propriedades em cada categoria.) Se eu usar PropertySort.NoSort
, Eu perco a categorização.
Estou preenchendo meu PropertyGrid
com SelectObject
, o que é muito fácil:
this.propertyGrid1.SelectedObject = options;
options
é uma instância de uma classe com propriedades adequadamente decoradas:
[CategoryAttribute("Category Title"),
DisplayName("Property Name"),
Browsable(true),
ReadOnly(false),
BindableAttribute(true),
DesignOnly(false),
DescriptionAttribute("...")]
public bool PropertyName {
get {
// ...
}
set {
// ...
this.OnPropertyChanged("PropertyName");
}
}
Tenho algumas dezenas de propriedades em meia dúzia de categorias.
Existe alguma maneira de ajustar a ordem de classificação da categoria, preservando minha facilidade de uso com SelectedObject
?
Solução
Se você quer dizer que deseja que as categorias classificadas de uma maneira específica (não alfabética), então não - eu não acho que você possa fazer isso. Você pode querer tentar Visualhint - Espero que ele tenha isso (já que você pode apreender muito mais controle).
Outras dicas
Eu acho que este link é útilhttp://bytes.com/groups/net-c/214456-q-ordering-sorting-category-text-propertyGrid
Não acredito que haja uma maneira de fazer isso. A única coisa que pude encontrar que indica que você pode fazer isso é a propriedade PropertySort. Se você o definir para nenhum, ele diz que as propriedades são exibidas na ordem em que são recebidas do descritor de tipo. Você pode criar um descritor do tipo proxy entre o seu objeto e o PropertyGrid, que retornaria não apenas as propriedades na ordem correta, mas as propriedades com as categorias na ordem em que você as deseja ...
Como @marc Gravel disse em sua resposta, não há nada na estrutura que permita esse comportamento. Qualquer solução será um hack. Com isso dito, você pode usar a solução sugerida por @shahab em sua resposta Como subir, mas isso realmente não indica sua intenção para quem mantém seu código. Então eu acho que o melhor que você pode fazer é criar um costume Attribute
que herda de CategoryAttribute
Para lidar com o processo para você:
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))
{
}
}
Então você pode usá -lo como tal
[CustomSortedCategory("Z Category",1,2)]
public string ZProperty {set;get;}
[CustomSortedCategory("A Category",2,2)]
public string AProperty {set;get;}
Apenas certifique -se de definir o PropertyGrid
's UseCompatibletextRendering
propriedade para true
para tirar os personagens não impressos para você e para o PropertySort
definido como Categorized
ou CategorizedAlphabetical
E você deve estar pronto para ir.
Uma pequena variação no truque ' t' descrito acima, eu apenas tentei com caracteres de retorno de carruagem (' r'). Parece funcionar e evita o problema da dica de ferramenta causado pelo espaço extra introduzido por uma guia.