Я пытаюсь настроить генерацию кода конструктора Windows Forms для InitializeComponent
. Статья MSDN «Настройка Генерация кода в.NET Framework Visual Designers» содержит раздел «Управление генерацией кода» , в котором объясняются основы того, как это можно сделать.
Я внимательно следил за примером в статья выше:
//using System.ComponentModel.Design.Serialization;
class SomeFormSerializer : CodeDomSerializer
{
public override object Serialize(IDesignerSerializationManager manager,
object value)
{
// first, let the default serializer do its work:
var baseSerializer = (CodeDomSerializer)manager.GetSerializer(
typeof(Form).BaseType, typeof(CodeDomSerializer));
object codeObject = baseSerializer.Serialize(manager, value);
// then, modify the generated CodeDOM -- add a comment as the 1st line:
if (codeObject is CodeStatementCollection)
{
var statements = (CodeStatementCollection)codeObject;
statements.Insert(0, new CodeCommentStatement("CODEDOM WAS HERE"));
}
// finally, return the modified CodeDOM:
return codeObject;
}
}
Теперь я подключаю это к своей формеSomeForm
:
[DesignerSerializer(typeof(SomeFormSerializer), typeof(CodeDomSerializer))]
class SomeForm : Form { … }
Конструктор форм может сгенерировать следующий InitializeComponent
код:
private void InitializeComponent()
{
… /* (general setup code, such as a call to `this.SuspendLayout`) */
//
// someButton
//
… /* (someButton's properties are set) */
// CODEDOM WAS HERE!
//
// SomeForm
//
… /* (form's properties are set) */
… /* (general setup code, such as a call to `this.ResumeLayout`) */
}
Обратите внимание, что комментарий // CODEDOM WAS HERE
не был добавлен в качестве самой первой строки в InitializeComponent
, но только как первая строка блока кода, который имеет дело со свойствами самого объекта формы.
Что бы я должен был сделать, если бы я хотел иметь возможность модифицировать сгенерированный CodeDOM всего метода, а не только части, связанной с конкретным объектом?
Предыстория :Зачем мне это нужно? В Windows Forms, если нужно гибкое преобразование значений при привязке данных, обычно приходится прибегать к подписке на события
Format
иParse
какого-то конкретного объектаBinding
. Итак, я создаю специализированныйBinding
подкласс (, назовем егоConvertingBinding
), который немного упрощает этот процесс.Теперь проблема заключается в том, что при настройке привязки данных в конструкторе Windows Forms сгенерированный код создает экземпляры
Binding
; однако я бы хотел, чтобы дизайнер вместо этого создавал экземпляр моего специализированного подкласса. Мой текущий подход заключается в том, чтобы позволить разработчику сначала создать дерево CodeDOM, затем пройтись по этому дереву и заменить все экземплярыBinding
экземплярамиConvertingBinding
.