Question

Sigh, une autre question de PropertyGrid. Je pensais pouvoir contourner ce problème jusqu'à ce que je sois confronté à un problème où je ne pouvais réellement pas l'éviter.

J'ai une propriété booléenne qui doit parfois être en lecture seule et qui doit parfois être modifiable en fonction de l'objet sélectionné dans une arborescence.

Ma question est la suivante: comment puis-je modifier le ReadOnlyAttribute d’une propriété de manière dynamique? Évidemment, créer une variable booléenne et essayer ensuite de la définir comme ReadOnlyAttribute (boolVar) ne fonctionne pas et maintenant je n'ai plus d'idées.

La seule solution à laquelle je puisse penser est de créer des classes séparées, presque identiques pour les éléments où cette propriété est accessible en écriture et une autre en lecture seule, mais cela me semble un peu peu élogieux.

Aide? :)

Était-ce utile?

La solution

Ce que je ferais serait de créer une classe de base avec une version protégée de la propriété, puis de créer deux classes héritant de la classe de base contenant les bits readonly et non readonly.

Autres conseils

Vous pouvez fournir des informations dynamiques sur les propriétés d'une classe à une grille de propriétés en implémentant ICustomTypeDescriptor .

La grille de propriétés affichera ICustomTypeDescriptor.GetProperties () , puis vous renvoyez une collection d'objets dérivés de PropertyDescriptors . Dans votre implémentation, vous pouvez remplacer le PropertyDescriptor.IsReadOnly propriété et implémentez votre logique.

C’est un peu du travail en premier lieu, mais cela vous donne la possibilité de renvoyer dynamiquement un nom et une description de propriété (utile pour la localisation), de marquer dynamiquement les propriétés en tant que propriétés en lecture seule, dynamiques d’affichage et de masquage, et faire beaucoup d'autres choses utiles.

Vous pouvez essayer quelque chose dans ce sens pour éviter la conversion de type impliquée dans plusieurs classes:

class TestClass
{
    private bool isMyPropertyReadOnly;

    public bool IsMyPropertyReadOnly
    {
        get { return isMyPropertyReadOnly; }
        set { isMyPropertyReadOnly = value; }
    }

    private int myVar;

    public int MyProperty
    {
        get { return myVar; }

        set
        {
            if (isMyPropertyReadOnly)
            {
                throw new System.Exception("The MyProperty property is read-only.");
            }
            else
            {
                myVar = value;
            }
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top