Код: Выделить всё
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Editor(typeof(StringCollectionEditor), typeof(UITypeEditor))]
public BindingList Items
{
get { return _items; }
set { _items = value; }
}
private BindingList _items = new BindingList();

Или, в более широком контексте...

Пользовательский редактор Реализация
Вот как я реализую класс, производный от UITypeEditor.Код: Выделить всё
public class StringCollectionEditor : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext? context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(ITypeDescriptorContext? context, IServiceProvider? provider, object? value)
{
if (
provider is IWindowsFormsEditorService validProvider &&
provider.GetService(typeof(IWindowsFormsEditorService)) is IWindowsFormsEditorService editorService)
{
if (editorService != null && value is IList strings)
{
using (Form form = new Form
{
FormBorderStyle = FormBorderStyle.None,
StartPosition = FormStartPosition.CenterParent,
Width = 300,
Height = 400,
Padding = new Padding(2),
BackColor = Color.Maroon,
})
{
TextBox textBox = new TextBox
{
Multiline = true,
Dock = DockStyle.Fill,
Text = string.Join(Environment.NewLine, strings)
};
Button okButton = new Button
{
Text = "OK",
Dock = DockStyle.Bottom,
DialogResult = DialogResult.OK,
Height = 50,
ForeColor = Color.White,
};
Button cancelButton = new Button
{
Text = "Cancel",
Dock = DockStyle.Bottom,
DialogResult = DialogResult.Cancel,
Height = 50,
ForeColor = Color.White,
};
form.Controls.Add(textBox);
form.Controls.Add(okButton);
form.Controls.Add(cancelButton);
form.CancelButton = cancelButton;
if (editorService.ShowDialog(form) == DialogResult.OK)
{
value = textBox.Text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList();
}
}
}
}
return value ?? new object();
}
}
Изолированное тестирование
И вот как я запускаю его автономно, чтобы увидеть, как оно работает:
Код: Выделить всё
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
buttonTest.Click += (sender, e) =>
{
var editor = new StringCollectionEditor();
var testList = new BindingList { "Item 1", "Item 2", "Item 3" };
ITypeDescriptorContext? context = null;
IWindowsFormsEditorService editorService = new MockWindowsFormsEditorService();
var serviceProvider = new SimpleServiceProvider();
serviceProvider.AddService(typeof(IWindowsFormsEditorService), editorService);
if(serviceProvider is IWindowsFormsEditorService validProvider)
{
if( serviceProvider.GetService(typeof(IWindowsFormsEditorService)) is IWindowsFormsEditorService validService)
{
// Invoke the editor
var result = editor.EditValue(context, (IServiceProvider)validProvider, testList);
MessageBox.Show($"Result: {string.Join(", ", result as IList)}");
}
else Debug.Fail("Expecting valid service");
}
else Debug.Fail("Expecting valid provider" );
};
}
}
public class SimpleServiceProvider : IWindowsFormsEditorService, IServiceProvider
{
private Dictionary services = new Dictionary();
public void AddService(Type serviceType, object serviceInstance)
{
services[serviceType] = serviceInstance;
}
public void CloseDropDown() => throw new NotImplementedException();
public void DropDownControl(Control? control) => throw new NotImplementedException();
public object GetService(Type serviceType)
{
services.TryGetValue(serviceType, out var service);
return service;
}
public DialogResult ShowDialog(Form dialog)
{
return default;
}
}
public class MockWindowsFormsEditorService : IWindowsFormsEditorService
{
public DialogResult ShowDialog(Form dialog) => dialog.ShowDialog();
public void DropDownControl(Control control) =>
throw new NotImplementedException("Not required for modal editors");
public void CloseDropDown() =>
throw new NotImplementedException("Not required for modal editors");
}
Подробнее здесь: https://stackoverflow.com/questions/789 ... forms-desi
Мобильная версия