Пользовательское свойство StringCollectionEditor для Items не отображается в конструкторе Winforms.C#

Место общения программистов C#
Ответить
Anonymous
 Пользовательское свойство StringCollectionEditor для Items не отображается в конструкторе Winforms.

Сообщение Anonymous »

Это не такая уж сложная задача, но у меня возникли проблемы с отображением пользовательского редактора для свойства Items моего пользовательского элемента управления.

Код: Выделить всё

[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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»