Создание универсального TypeEditor - PullRequest
1 голос
/ 15 ноября 2010

Скажем, у меня есть свойство Foo типа SomeType в классе типа SomeClass, которое редактируется с помощью пользовательского редактора SomeTypeEditor:

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

Функция SomeTypeEditor.EditValue выглядитчто-то вроде этого:

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

Теперь я хотел бы добавить еще одно свойство Baz, также типа SomeType, к SomeClass.Я хотел бы изменить это свойство SomeTypeEditor, но строка

someClass.Foo = form.Result;

в EditValue связывает SomeTypeEditor с этим конкретным свойством.Было бы достаточно просто сделать копию SomeTypeEditor, которая вместо этого редактирует Baz, но я бы хотел избежать этого, если это возможно.В любом случае, можно ли сделать мой SomeTypeEditor универсальным (в любом смысле этого слова), чтобы его можно было использовать для редактирования Foo и Baz?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2010

Я только что узнал, что если я позволю EditValue вернуть значение object, отличное от value, set будет вызвано для свойства, из которого происходит редактирование, поэтому просто выполните:

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

работает (SomeTypeEditor клонирует входящее значение и редактирует клон).

0 голосов
/ 15 ноября 2010

Вы можете использовать provider, чтобы получить имя редактируемого свойства в сетке свойств.Чтобы увидеть это, установите точку останова в вашей процедуре редактирования EditValu e, а затем наведите курсор мыши на свойство providerРазверните его, и вы увидите, что оно содержит свойство с именем редактируемого Foo / Baz.Не уверен, что это рекомендуемый способ получения информации, но, похоже, он работает.

...