Создание общего типовтора
-
10-10-2019 - |
Вопрос
Скажи, что у меня есть собственность 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
Чтобы получить название имущества, отредактированного в сетке недвижимости. Чтобы увидеть это, установите точку перерыва в вашей рутине редактирования EditValu
E, а затем парить над provider
имущество. Разверните его, и вы увидите, что он содержит свойство с именем отредактируемого Foo/Baz. Не уверен, это рекомендуемый способ получить информацию, но, похоже, работает.