Я пишу оболочку для связи OPC с контроллером, и я создал компонент следующим образом:
public class OPCGroup : Component
{
(snipped)
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<OPCItem> Items
{
get { return mItems; }
set { mItems = value; }
}
}
Каждый элемент в списке элементов выше выглядит следующим образом
public class OPCItem : MarshalByRefObject, IDisposable
{
private String mName;
private String mTag;
private object mValue;
public String Name
{
get { return mName; }
set { mName = value; }
}
public String Tag
{
get { return mTag; }
set { mTag = value; }
}
public object Value
{
get { return mValue; }
set { Change(value, true); }
}
public event OPCItemEvent Changed;
}
Теперь проблема в том, что событие Changed OPCItem не изменяется во время разработки, я могу добавлять события к элементам во время выполнения, используя
opcGroup1.Items[0].Changed += new OPCItemEvent(Item0Changed);
Однако я хотел бы иметь возможностьвместо этого связывайте события во время разработки, поскольку это проще.
Я попытался создать события вручную с помощью IEventBindingService в пользовательском UITypeEditor следующим образом
IEventBindingService eventBindingService = provider.GetService(typeof(IEventBindingService)) as IEventBindingService;
EventDescriptorCollection edc = TypeDescriptor.GetEvents(Group.Items[0]);
EventDescriptor Event = edc.Find("Changed", false);
PropertyDescriptor pd = eventBindingService.GetEventProperty(Event);
pd.SetValue(Group.Items[0], Group.Items[0].Name + "Changed");
Но тогда я получаю ошибку
Невозможно установить события для объекта, переданного службе привязки событий, поскольку не удалось найти сайт, связанный с объектом
Итак, я реализовал интерфейс IComponent вКласс OPCItem для получения свойства Site, но теперь элементы коллекции отображаются в конструкторе.
Есть ли какие-либо советы о том, как решить эту проблему?