Définir de façon dynamique en lecture seule attribut de propriétés dans une grille de propriété

J'ai un PropertyGrid que j'ai utilisé pour afficher les propriétés dans une classe d'assistance. - Je attribuer la classe d'aide à la PropertyGrid comme ceci:

myPropertyGrid.SelectedObject = mySettingsHelper;

Dans la classe helper-je attribuer le ReadOnlyAttribute au moment de la conception comme ceci:

[DisplayName("DisplayExA"),
Description("DescriptionExA"),
ReadOnlyAttribute(true)]
public string PropertyA { get; set; }

[DisplayName("DisplayExB"),
Description("DescriptionExB"),
ReadOnlyAttribute(false)]
public string PropertyB { get; set; }

[DisplayName("DisplayExC"),
Description("DescriptionExC"),
ReadOnlyAttribute(true)]
public string PropertyC { get; set; }

Mais maintenant, j'ai besoin d'être en mesure de modifier cet attribut sur les propriétés individuelles de façon dynamique lors de l'exécution. Basé sur certains critères, certaines de ces propriétés peuvent avoir besoin d'être en lecture seule ou non en lecture seule. Comment pourrais-je faire le changement de manière dynamique au moment de l'exécution?

EDIT:

J'ai essayé le code suivant mais il permet de définir l'attribut lecture seule pour chaque instance de l'objet! Je veux le faire par objet. Parfois, un objet pourrait avoir PropertyA en lecture seule, tandis qu'un second objet a PropertyA de ne pas être en lecture seule.

public static class PropertyReadOnlyHelper
{
    public static  void SetReadOnly(object container, string name, bool value)
    {
        try
        {
            PropertyDescriptor descriptor = TypeDescriptor.GetProperties(container.GetType())[name];
            ReadOnlyAttribute attribute = (ReadOnlyAttribute)descriptor.Attributes[typeof(ReadOnlyAttribute)];
            FieldInfo fieldToChange = attribute.GetType().GetField("isReadOnly",
                                                System.Reflection.BindingFlags.NonPublic |
                                                System.Reflection.BindingFlags.Instance);
            fieldToChange.SetValue(attribute, value);
        }
        catch { }
    }
}
Combien de PropertyGrid utilisez-vous dans votre application? Je pense que votre but peut être atteint que si il ya seulement 1 PropertyGrid utilisé à un moment, nous avons encore de changer le Attribute pour le type, mais avant de sélectionner un objet, nous allons basculer le ReadOnly en conséquence, et cela devrait faire l'affaire.

OriginalL'auteur Michael Mankus | 2013-10-28