Вопрос

Скажи, что у меня есть собственность 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

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top