我正在为控制器编写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;
}
现在问题是OPCItem的Changed事件在设计时间不可更改,我可以使用
在运行时向项添加事件opcGroup1.Items[0].Changed += new OPCItemEvent(Item0Changed);
但是,我希望能够在设计时绑定事件,因为它更容易。
我尝试使用自定义UITypeEditor中的IEventBindingService手动创建事件,如下所示
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");
但后来我收到了错误
无法在传递给事件绑定服务的对象上设置事件,因为无法找到与该对象关联的站点
然后我在OPCItem类中实现了IComponent接口以获取Site属性,但现在集合项显示在设计器上。
有关如何解决此问题的任何建议吗?