Хорошо, я наконец смог отследить, как это сделать.
Я пытался создать пользовательский CollectionEditor.CollectionForm
, который был близок к тому, что мне нужно было сделать, но это было не совсемправильное направление.
Прежде всего, создайте обычную форму Windows, которая включает ваш графический интерфейс для редактирования вашей коллекции.Затем просто включите кнопки / кнопки, которые возвращают DialogResult в форме.
Теперь ключ к достижению того, что я искал, не CollectionEditor.CollectionForm
, как я думал, будет правильным подходом, а скорее UITypeEditor
.
Итак, я создал класс, унаследованный от UITypeEditor.Затем вы просто уточняете это так:
public class CustomCollectionModalEditor: UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
if (context ==null || context.Instance == null)
return base.GetEditStyle(context);
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
IWindowsFormsEditorService editorService;
if (context == null || context.Instance == null || provider == null)
return value;
editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
CForm CollectionEditor = new CForm();
if (editorService.ShowDialog(CollectionEditor) == System.Windows.Forms.DialogResult.OK)
return CollectionEditor.Programmed;
return value;
//return base.EditValue(context, provider, value);
}
}
Ключевыми частями, на которые следует обратить внимание, являются функции GetEditStyle
и EditValue
.Часть, ответственная за запуск Формы, созданной вами для редактирования вашей коллекции, находится в функции переопределения EditValue
.
CForm
- это пользовательская форма редактора коллекции, которую я разработал в этом тесте для редактирования коллекции.Вам нужно получить IWindowsFormsEditorService
, связанный с IServiceProvider
, и просто вызвать .ShowDialog(formVariable)
из IWindowsFormsEditorService
, чтобы показать форму, созданную вами для редактирования коллекции.Затем вы можете catch
возвращенное DialogResult
значение из вашей Формы и выполнить любую пользовательскую обработку, которая вам требуется.
Я надеюсь, что это кому-то поможет, так как мне понадобилось немало копать, чтобы определить правильный путьчтобы включить это.