2009-05-19 9 views
1

J'ai un PropertyGrid qui reflète les propriétés de ma classe. Je regarde l'événement PropertyValueChanged et remarque que PropertyValueChangedEventArgs fournit le GridItem qui a été modifié.Comment définir propertygrid griditem tag

Ce GridItem possède une propriété Tag que je peux obtenir. Je ne vois pas comment définir la propriété Tag d'un GridItem à une valeur.

Comment puis-je définir la propriété Tag d'un objet GridItem?

Répondre

0

... Ma réponse originale était assez loin, je suis tellement revamping la chose entière dans cette mise à jour ...

Voici ce que je ferais si je devais répondre à cette exigence.

Créez un attribut qui sera utilisé pour prédéfinir la valeur Tag de votre GridItem; appelons-le TagAttribute. Il pourrait être aussi simple que cela:

public class TagAttribute : Attribute 
{ 
    public string TagValue { get; set; } 

    public TagAttribute (string tagValue) 
    { 
     TagValue = tagValue; 
    } 
} 

prédéfinir la Tag valeur, vous avez juste besoin de décorer la propriété désirée avec cet attribut.

public class MyAwesomeClass 
{ 
    ... 
    [TagAttribute("This is my tag value.")] 
    [CategoryAttribute("Data")] 
    public string MyAwesomeProperty { get; set; } 
    ... 
} 

Je puis hériter de la PropertyGrid et passer outre le OnPropertyValueChanged événement afin de définir le Tag propriété du GridItem pour coïncider avec la pré-défini TagAttribute.

public partial class InheritedPropertyGrid : PropertyGrid 
{ 
    ...  
    protected override void OnPropertyValueChanged (PropertyValueChangedEventArgs e) 
    { 
     var propertyInfo = SelectedObject.GetType().GetProperty(e.ChangedItem.PropertyDescriptor.Name); 
     var tagAttribute = propertyInfo.GetCustomAttributes(typeof(TagAttribute) , false); 

     if (tagAttribute != null) 
      e.ChangedItem.Tag = ((TagAttribute)tagAttribute[0]).TagValue; 

     base.OnPropertyValueChanged(e); 
    }  
    ... 
} 

Maintenant, quand vous crochet dans la OnPropertyValueChanged de cette « InheritedPropertyGrid », le Tag propriété sera définie à ce que vous avez défini sur la propriété.

+0

ChangedItem est un objet GridItem. Je veux définir la propriété d'étiquette quand ce GridItem est créé. Mais le GridItem est le reflet d'une propriété de ma classe. Lorsque je crée cette propriété, j'utilise des attributs tels que "Description", "Navigable", etc. Je pensais qu'il pourrait y avoir un attribut "Tag". – mohnston

+0

le seul problème avec cette méthode est qu'elle permettra seulement le réglage des données statiques. –

+0

Dans le cadre de la question de l'OP, je ne pense pas que cela serait considéré comme un "problème" car la demande consiste à prédéfinir une valeur "Tag" (ce que cela permet). –