.net - ¿Cómo puedo personalizar la clasificación de categorías en un PropertyGrid?
winforms (4)
¿Cómo puedo personalizar la clasificación de categorías en un PropertyGrid
?
Si configuro alguno de los siguientes ...
propertyGrid.PropertySort = PropertySort.Categorized;
propertyGrid.PropertySort = PropertySort.CategorizedAlphabetical;
... entonces las categorías estarán alfabetizadas. ("Alfabético" parece aplicarse a las propiedades dentro de cada categoría). Si uso PropertySort.NoSort
, pierdo la categorización.
Estoy poblando mi PropertyGrid
con SelectObject
, que es bastante fácil:
this.propertyGrid1.SelectedObject = options;
options
es una instancia de una clase con propiedades adecuadamente decoradas:
[CategoryAttribute("Category Title"),
DisplayName("Property Name"),
Browsable(true),
ReadOnly(false),
BindableAttribute(true),
DesignOnly(false),
DescriptionAttribute("...")]
public bool PropertyName {
get {
// ...
}
set {
// ...
this.OnPropertyChanged("PropertyName");
}
}
Tengo unas pocas docenas de propiedades en media docena de categorías.
¿Hay alguna manera en que pueda ajustar el orden de clasificación de la categoría y preservar mi facilidad de uso con SelectedObject
?
Como dijo @Marc Gravel en su respuesta , no hay nada en el marco que permita este comportamiento. Cualquier solución será un hack. Dicho esto, puede utilizar la solución sugerida por @Shahab en su respuesta como una solución alternativa, pero eso no indica realmente su intención de que alguien mantenga su código. Así que creo que lo mejor que puedes hacer es crear un Attribute
personalizado que hereda de CategoryAttribute
para manejar el proceso por ti:
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))
{
}
}
Entonces puedes usarlo como tal
[CustomSortedCategory("Z Category",1,2)]
public string ZProperty {set;get;}
[CustomSortedCategory("A Category",2,2)]
public string AProperty {set;get;}
Solo asegúrese de configurar la PropertyGrid
UseCompatibletextRendering
PropertyGrid en true
para eliminar los caracteres no imprimibles para usted y PropertySort
establecido en Categorized
o CategorizedAlphabetical
y debería estar listo.
Creo que este enlace es útil http://bytes.com/groups/net-c/214456-q-ordering-sorting-category-text-propertygrid
No creo que haya una manera de hacer esto. Lo único que puedo encontrar que indica que es posible que pueda hacer esto es la propiedad PropertySort. Si lo establece en ninguno, dice que las propiedades se muestran en el orden en que se reciben del descriptor de tipo. Es posible que pueda crear un descriptor de tipo proxy entre su objeto y el propertygrid, que luego devolvería no solo las propiedades en el orden correcto, sino también las propiedades con las categorías en el orden en que las quiere ...
Si quiere decir que quiere que las categorías se clasifiquen de una manera específica (no alfabética), entonces no, no creo que pueda hacerlo. Es posible que desee probar VisualHint ; espero que tenga esto (ya que puede tomar mucho más control).
Una pequeña variación en el truco ''/ t'' descrito anteriormente, lo probé con caracteres de retorno de carro (''/ r'') en su lugar. Parece funcionar y evita el problema de la información sobre herramientas causado por el espacio adicional introducido por una pestaña.