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?

War es hilfreich?

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 EditValue 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top