Faire un TypeEditor générique
-
10-10-2019 - |
Question
Dire que j'ai un Foo
de propriété de type SomeType
dans une classe de type SomeClass
qui est édité avec un éditeur personnalisé SomeTypeEditor
:
[EditorAttribute(typeof(SomeTypeEditor), ...)]
public SomeType Foo
{
get
{
return BuildFooFromInternalRepresenation();
}
set
{
UpdateInternalRepresentation(value);
}
}
La fonction SomeTypeEditor.EditValue
ressemble à quelque chose comme ceci:
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (null == edSvc)
{
return null;
}
var form = new SomeTypeEditorForm(value as SomeType);
if (DialogResult.OK == edSvc.ShowDialog(form))
{
var someClass = context.Instance as SomeClass;
someClass.Foo = form.Result;
return someClass.Foo;
}
else
{
return value;
}
}
Je voudrais maintenant ajouter un autre Baz
de propriété, également de type SomeType
, à SomeClass
. Je voudrais modifier cette SomeTypeEditor
de propriété, mais la ligne
someClass.Foo = form.Result;
dans les liens de EditValue
SomeTypeEditor
à cette propriété particulière. Il serait assez simple à faire juste un double de SomeTypeEditor
qui édite Baz
place, mais je voudrais éviter que, si possible. Y at-il de toute façon de faire mon SomeTypeEditor
générique (dans tous les sens du mot) de sorte qu'il peut être utilisé pour modifier à la fois Foo
et Baz
?
La solution 2
Je viens de découvrir que si je laisse un autre EditValue
retourner object
que value
, set
sera invoqué sur la propriété à partir de laquelle l'édition origine, ce faisant simplement:
if (DialogResult.OK == edSvc.ShowDialog(form))
{
var someClass = context.Instance as SomeClass;
return form.Result;
}
oeuvres (clones SomeTypeEditor
la valeur entrante et édite le clone).
Autres conseils
Vous pouvez utiliser la provider
pour obtenir le nom de la propriété en cours de modification dans la grille de la propriété. Pour voir cet ensemble un point de rupture sur votre routine EditValu
e édition et vol stationnaire au-dessus de la propriété provider
. Développez et vous verrez qu'il contient une propriété avec le nom de Foo / Baz en cours d'édition. Je ne sais pas si cela est la méthode recommandée pour obtenir l'information, mais il semble fonctionner.