Fare un TypeEditor generica
-
10-10-2019 - |
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
?
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 EditValu
e 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.