2008-08-25 8 views
2

J'ai un extendeur (IExtenderProvider) qui étend certains types de contrôles avec des propriétés supplémentaires. Pour l'une de ces propriétés, j'ai écrit un UITypeEditor. Jusqu'à présent, tout fonctionne bien.UITypeEditor et IExtenderProvider

L'extendeur a également quelques propriétés lui-même, que j'essaye d'utiliser comme une sorte de défaut pour l'UITypeEditor . Ce que je veux faire est d'être en mesure de définir une propriété sur l'extendeur lui-même (pas les contrôles étendus), et quand j'ouvre l'UITypeEditor pour l'une des propriétés supplémentaires sur un contrôle étendu, je veux définir un valeur dans UITypeEditor à la valeur de la propriété sur l'extendeur.

Un exemple simple: ExtenderProvider a une propriété DefaultExtendedValue. Sur le formulaire, je définis la valeur de cette propriété sur "Ma valeur". Les contrôles étendus ont, via le fournisseur, une propriété ExtendedValue avec un UITypeEditor. Lorsque j'ouvre l'éditeur de la propriété ExtendedValue, la valeur par défaut (initiale) doit être définie sur "Ma valeur".

Il me semble que le meilleur endroit pour le faire serait UITypeEditor.EditValue, juste avant d'appeler IWindowsFormsEditorService.DropDownControl ou .ShowDialog. Le seul problème est que je ne peux pas (ou je n'ai pas découvert comment) obtenir du fournisseur d'extendeur lui-même dans EditValue, pour lire la valeur de la propriété en question et le définir dans l'UITypeEditor. Contexte me donne le contrôle étendu , mais cela ne me sert à rien dans ce cas.

Y at-il un moyen de réaliser ce que j'essaie? Toute aide appréciée!

Merci Tom


@samjudson: Ce n'est pas une mauvaise idée, mais malheureusement, il ne me comprends pas bien là-bas. J'aimerais vraiment pouvoir définir cette valeur par défaut individuellement pour chaque instance du fournisseur d'extension. (Je pourrais en avoir plusieurs sur un même formulaire avec des valeurs différentes pour différents groupes de contrôles étendus.)

Répondre

0

Avez-vous envisagé d'ajouter DefaultValue en tant que propriété statique de ExtenderProvider, alors vous pouvez y accéder sans avoir besoin d'une instance de le fournisseur?

2

Pourriez-vous lire l'attribut vous-même?

DefaultValueAttribute att = context. 
    PropertyDescriptor.Attributes. 
    OfType<DefaultValueAttribute>(). 
    FirstOrDefault(); 
object myDefault = null; 
if (att != null) 
    myDefault = att.Value; 

Je l'ai utilisé pour simplifier Linq le code, mais vous pouvez faire quelque chose de similaire retour dans .Net 1

1

Salut, j'ai trouvé ceci: http://social.msdn.microsoft.com/forums/en-US/winformsdesigner/thread/07299eb0-3e21-42a3-b36b-12e37282af83/

En gros:

var Ctl = context.Instance as Control; 

Type t = Type.GetType("System.ComponentModel.ExtendedPropertyDescriptor"); 
LocalizationProvider myProvider = GetValueOnPrivateMember(t, context.PropertyDescriptor, "provider") as MyOwnExtenderProvider; 

Et magiquement, myProvider a obtenu mon contrôle IExtenderProvider!

où GetValueOnPrivateMember devrait être mis en œuvre ainsi:

static object GetValueOnPrivateMember(Type type, object dataobject, string fieldname) 
     { 
      BindingFlags getFieldBindingFlags = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField; 
      return type.InvokeMember(fieldname, 
       getFieldBindingFlags, 
       null, 
       dataobject, 
       null); 
     } 
Questions connexes