我正在创建一个名为PanelsList
的类,它基本上是TabControl
,顶部没有标题,因此页面只能以编程方式更改。每个“标签”都是PanelsListItem
派生的名为Panel
的类的实例。我还创建了一个实现PanelsListItemCollection
和ICollection
的课程ICollection<PanelsListItem>
。所以我在PanelsList
添加了以下内容:
private PanelsListItemCollection _Items;
public PanelsListItemCollection Items
{
get { return _Items; }
set { SetItems(value); }
}
private void SetItems(PanelsListItemCollection value)
{
if (_Items != value)
{
if (_Items != null) _Items.PanelsList= null;
_Items = value;
if (_Items != null) _Items.PanelsList= this;
}
}
我认为在为表单构建并添加PanelsList
后,我可以在设计时编辑PanelsListItemCollection
。但是当我点击 Proeprties 编辑器中属性Items
上的“...”按钮时,对象集合编辑器会打开,但添加和删除按钮被禁用。
当我向List<Control> Stuff { get; set; }
添加了一个属性PanelsList
时,我可以在设计时添加和删除Stuff
中的控件。我想知道是否需要实施IList
而不是ICollection
?
修改:我刚刚尝试实施IList<PanelsListItem>
,但它没有修复它。
答案 0 :(得分:1)
为了让设计人员自动支持集合,它必须实现非通用IList
接口 - IList<T>
将不会自动运行。这是因为默认的集合编辑器依赖于知道每个项目的索引。与设计器兼容的另一个要求(您的代码已经满足)是暴露您的集合的属性必须同时具有get
和set
方法;设计人员在编辑期间制作集合的临时副本,然后在用户单击“确定”时将其分配给属性。
如果默认值不够好,您可以通过扩展UITypeEditor
类(在System.Drawing.Design
名称空间中)并使用{{1}在代码中修饰属性来实现自己的集合编辑器。 },例如
EditorAttribute
您还可以扩展现有的[Editor(typeof(MyCustomCollectionEditor), typeof(UITypeEditor))]
public PanelsListItemCollection Items { /* ... */ }
类,但该类仅向派生类公开非常有限的功能。