实际上我写了一个UserControl,它充当其他(让我们称之为)NestedUserControls的容器。
我以编程方式实现了将这样的NestedUserControls添加到我的UserControl中(通过App(string name)
函数)。但实际上我更喜欢将某种List作为UserControl的公共属性。
但问题是,我的NestedUserControl需要放入private UserControl.panel.Controls
列表。在我自己编写的Add()
函数中,这不是什么大问题。但是,当我使用List<NestedUserControl>
属性时,如何才能解决这个问题?当列表以任何方式改变时,我都没有得到任何信息。
我实际发现的唯一想法是创建某种EventList<>
,只要列表发生变化就会抛出一个事件。那么这将是“正确的”方式还是你有更好的方法(或者在.Net框架中已经存在某种EventList?
哦,在我忘记之前:我正在使用VS2008,C#,WinForms,.Net 3.5 SP1
答案 0 :(得分:1)
如果我正确理解你的问题,你要么必须使用一个可观察的集合来存储嵌套的用户控件,不幸的是我所知道的唯一一个是在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
答案 1 :(得分:0)
所以为了在这个问题中更清楚,我的解决方案是:
我喜欢做的是,在我的UserControlContainer中添加一个List,可以在运行时或设计时轻松更改 。为了正确地处理设计时间,我不得不继承CollectionBase而不是List&lt;&gt;并添加了DesignerSerializationVisibility(DesignerSerializationVisibility.Content)attribut。 CollectionBase本身为Insert,Remove和Clear提供了一些事件。
在实现这些函数并将我自己定义的事件ListChangedEvent的激活添加到外部世界之后,我能够获得有关任何列表更改的信息。
您唯一的问题是,CollectionEditor不会从列表中删除任何对象。相反,它似乎与第二个内部列表一起使用。点击确定后,您的列表将被清除并填写其他事件。所以不要错过处理CollectionBase.OnClear或CollectionBaseOnClearComplete函数!