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?

Était-ce utile?

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 EditValue é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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top