Einen generic TypeEditor
-
10-10-2019 - |
Frage
sagen, ich habe eine Eigenschaft Foo
vom Typ SomeType
in einer Klasse von Typ SomeClass
, die mit einem benutzerdefinierten Editor SomeTypeEditor
bearbeitet wird:
[EditorAttribute(typeof(SomeTypeEditor), ...)]
public SomeType Foo
{
get
{
return BuildFooFromInternalRepresenation();
}
set
{
UpdateInternalRepresentation(value);
}
}
Die SomeTypeEditor.EditValue
Funktion sieht wie folgt aus:
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;
}
}
Ich möchte nun eine andere Eigenschaft Baz
hinzuzufügen, ebenfalls vom Typ SomeType
, zu SomeClass
. Ich möchte diese Eigenschaft SomeTypeEditor
bearbeiten, aber die Zeile
someClass.Foo = form.Result;
in EditValue
Bindungen SomeTypeEditor
auf diese besondere Eigenschaft. Es wäre einfach genug sein, um nur ein Duplikat SomeTypeEditor
machen, die Änderungen Baz
statt, aber ich mag, dass wenn möglich vermeiden. Gibt es trotzdem meine SomeTypeEditor
Generika (in jedem Sinne des Wortes) zu machen, damit es sowohl Foo
und Baz
zu bearbeiten verwendet werden kann?
Lösung 2
Ich habe gerade herausgefunden, dass, wenn ich lasse einen anderen EditValue
als object
value
zurückkehren, wird set
auf dem Grundstück geltend gemacht werden, aus dem das Bearbeiten entstanden sind, so einfach tun:
if (DialogResult.OK == edSvc.ShowDialog(form))
{
var someClass = context.Instance as SomeClass;
return form.Result;
}
Werke (SomeTypeEditor
Klone den eingehenden Wert und bearbeitet den Klon).
Andere Tipps
Sie können die provider
verwenden Sie den Namen der Eigenschaft zu erhalten, in dem Eigenschaftenraster bearbeitet wird. Um dies zu sehen Set einen Haltepunkt auf Ihrer Bearbeitung Routine EditValu
e und dann schwebt über die provider
Eigenschaft. Erweitern Sie es, und Sie werden sehen, dass es eine Eigenschaft mit dem Namen des Foo / Baz bearbeitet enthält. Nicht sicher, ob dies der empfohlene Weg ist, um die Informationen zu erhalten, aber es scheint zu funktionieren.