代码之家  ›  专栏  ›  技术社区  ›  Oliver

myusercontrol.list<nestedcontrol>和myusercontrol.panel.controls之间的最佳“连接”

  •  1
  • Oliver  · 技术社区  · 16 年前

    实际上,我编写了一个用户控件,它充当其他(我们称之为)NestedUserControls的容器。

    我实现了一种以编程方式将此类NestedUserControls添加到我的用户控件(通过 App(string name) 函数)。但实际上我更喜欢的是某种列表,作为我的用户控件的公共属性。

    但问题是,我的NestedUserControl需要 private UserControl.panel.Controls 名单。在我自己写的 Add() 功能,这不是大问题。但是当我使用 List<NestedUserControl> 财产?当列表以任何方式更改时,我没有得到任何信息。

    我发现的唯一办法是 EventList<> 它会在列表更改时引发事件。那么,这是“正确”的方式,还是您有更好的方法(或者可能在.NET框架中已经存在某种类型的事件列表)??

    哦,在我忘记之前:我使用的是vs2008,c,winforms,.net 3.5 sp1

    2 回复  |  直到 16 年前
        1
  •  1
  •   Grzenio    16 年前

    如果我正确理解了您的问题,您要么使用可观察的集合来存储嵌套的用户控件,不幸的是,我知道的唯一一个集合在WPF程序集中: http://msdn.microsoft.com/en-us/library/ms668604.aspx 或者,最好只暴露 IList<NestedUserControl> 到用户控件的用户,并以将大部分工作委托给的方式实现此接口 UserControl.panel.Controls . 如何实现IList的示例: http://damieng.com/blog/2006/06/14/Observing_change_events_on_a_ListT

        2
  •  0
  •   Oliver    16 年前

    因此,为了在这个问题中获得更清晰的认识,我的解决方案是:

    我想做的是,向我的UserControlContainer添加一个列表,可以 容易地 在运行时或设计时更改。为了让它在设计时正常工作,我必须从CollectionBase继承而不是从List<gt;继承,并添加DesignerSerializationVisibility(DesignerSerializationVisibility.Content)属性。CollectionBase本身提供了一些用于插入、删除和清除的事件。

    在实现了这些功能并向外部世界添加了我自己定义的事件listchangedevent的触发之后,我能够获得关于任何列表更改的信息。

    唯一的问题是collectioneditor不会从列表中删除任何对象。相反,它似乎与第二个内部列表一起工作。点击OK(确定)后,您的列表将被清除并填入其他事件。所以不要错过处理collectionbase.onclear或collectionbaseonclearComplete函数!

    推荐文章