Pregunta

decir que tengo una propiedad de tipo Foo SomeType en una clase de tipo SomeClass que se edita con una SomeTypeEditor editor personalizado:

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

La apariencia de función SomeTypeEditor.EditValue algo como esto:

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

Ahora me gustaría añadir otro Baz propiedad, también de tipo SomeType, a SomeClass. Me gustaría editar esta propiedad, pero SomeTypeEditor la línea

someClass.Foo = form.Result;

en lazos EditValue SomeTypeEditor a esta propiedad particular. Sería lo suficientemente simple para simplemente hacer un duplicado de SomeTypeEditor que edita Baz lugar, pero me gustaría evitar que si es posible. ¿Hay alguna forma de hacer mi SomeTypeEditor genérica (en cualquier sentido de la palabra) para que pueda ser utilizado para editar tanto Foo y Baz?

¿Fue útil?

Solución 2

Me acabo de enterar que si dejo EditValue devolver un object diferente que value, set será invocado en la propiedad de la que se originó la edición, por lo que acaba de hacer:

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

obras (SomeTypeEditor clones del valor de entrada y edita el clon).

Otros consejos

Puede utilizar el provider para obtener el nombre de la propiedad que está siendo editado en la cuadrícula de propiedades. Para ver este conjunto un punto de quiebre en su EditValue rutina de edición y luego ciernen sobre la propiedad provider. Expandirla y verá que contiene una propiedad con el nombre de la Foo / Baz se está editando. No estoy seguro si esta es la forma recomendada para obtener la información, pero parece que funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top