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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top