Haciendo un TypeEditor genérica
-
10-10-2019 - |
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
?
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 EditValu
e 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.