Domanda

dire che ho un Foo proprietà di tipo SomeType in una classe di tipo SomeClass che viene modificato con un SomeTypeEditor editor personalizzato:

[EditorAttribute(typeof(SomeTypeEditor), ...)]
public SomeType Foo
{
    get
    {
        return BuildFooFromInternalRepresenation();
    }
    set
    {
        UpdateInternalRepresentation(value);
    }
}

Lo sguardi funzione SomeTypeEditor.EditValue qualcosa di simile:

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;
    }
}

Vorrei ora aggiungere un altro Baz di proprietà, anche di tipo SomeType, a SomeClass. Vorrei modificare questa proprietà SomeTypeEditor ma la linea

someClass.Foo = form.Result;

in legami EditValue SomeTypeEditor a questa particolare proprietà. Sarebbe abbastanza semplice da solo fare un duplicato di SomeTypeEditor che le modifiche Baz invece ma vorrei evitare che, se possibile. Esiste un modo per rendere la mia SomeTypeEditor generico (in ogni senso della parola) in modo che possa essere utilizzato per modificare sia Foo e Baz?

È stato utile?

Soluzione 2

Ho appena scoperto che se ho lasciato EditValue restituire un object diverso rispetto value, set verrà invocato sulla proprietà da cui la modifica ha avuto origine, quindi basta fare:

if (DialogResult.OK == edSvc.ShowDialog(form))
{
    var someClass = context.Instance as SomeClass;
    return form.Result;
}

opere (SomeTypeEditor cloni il valore in ingresso e modifica il clone).

Altri suggerimenti

È possibile utilizzare la provider per ottenere il nome della proprietà in corso di modifica nella griglia proprietà. Per vedere questo insieme un punto di rottura sul vostro modifica EditValue routine e poi con il mouse sopra la proprietà provider. Espanderla e vedrete che contiene una proprietà con il nome di Foo / Baz in fase di modifica. Non sono sicuro se questo è il metodo consigliato per ottenere le informazioni, ma sembra funzionare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top