【发布时间】:2010-11-11 12:20:15
【问题描述】:
我在一家建筑公司工作,我正在为 3D 建模程序创建一个插件来协助设计。我有一个 Building 类和一个 Floor 类。该建筑物包含对 FloorList 楼层集合的引用。我试图弄清楚 FloorList 集合的基础是什么,这样我就可以最大限度地减少创建一个编辑集合的界面所需的工作量。
Floor 系列代表了一系列相互堆叠的建筑楼层。每个 Floor 都有一个可读写的 Floor.Height 属性,以及一个只读且通过合计楼层来设置的 Floor.Elevation 属性低于当前楼层的高度。因此,每当在集合中添加、删除、移动或更改 Floor 时,都需要更新 Floor.Elevation 属性。
另外,我想创建一个 UI 来编辑这个集合。我正在考虑使用 DataGrid 控件,其中每个 Floor 与它的 Height 和其他属性作为控件的一行列出。用户应该能够使用控件添加、删除和重新排序楼层。我希望将其设置为尽可能简单和灵活。这意味着我希望能够简单地将 Floors 集合绑定到 DataGrid 并根据 Floor 的属性填充 DataGrid 的列 类。如果可能的话,我希望能够利用 DataGrid 控件的内置添加/删除 UI 界面,而不必在我的集合和 DataGrid 之间设置一堆事件关系。
为了让事情在未来变得更加复杂,我需要能够允许用户动态地向 Floors 添加自定义属性,我希望他们能够在其中查看和编辑DataGrid 也是如此。我想我最终会通过让 Floor 类实现 IExtenderProvider 来做到这一点。所以最终 DataGrid 看起来像这样:
初始属性 未来自定义用户属性 海拔高度 ProgramType UnitType UnitCount 15' 70' 豪华住宅 5 15' 55' 豪华住宅 5 15' 40' 住宅预算 10 20' 20' 零售 N/A 2 20' 0' 零售 N/A 3我现在的问题是我的 FloorList 集合应该以什么为基础才能实现此功能?我正在考虑的选项如下。
1) 继承自 List(Floor)
- 添加/删除等方法不是虚拟的,因此我不能不覆盖它们来更新高程
2) 实现 IList(Floor)
OnChange 事件未内置,因此如果列表发生更改,DataGrid 将不会更新(我认为?)
我认为这可能是最好的选择,但我需要做些什么来确保对 FloorList 集合或 DataGrid 的更改彼此同步?
3) 继承自 BindingList(Floor)
- Add/Remove 之类的方法不是虚拟的,因此我无法修改它们来更新楼层标高。
4) 实现 IBindingList
- IBindinglist 不是通用的,我只希望我的集合包含 Floor 对象
【问题讨论】:
标签: c# list collections binding bindinglist