私は建築会社で働いており、設計を支援する 3D モデリング プログラムのプラグインを作成しています。BuildingクラスとFloorクラスがあります。建物には、フロアのFloorListコレクションへの参照が含まれています。コレクションを編集するためのインターフェイスを作成するために必要な作業量を最小限に抑えるために、 FloorListコレクションのベースとなるものを見つけようとしています。
Floorコレクションは、互いに積み重ねられた一連の建物の床を表します。各Floorには、読み書き可能なFloor.Heightプロパティと、読み取り専用で現在のFloorより下の床の高さを合計して設定されるFloor.Elevationプロパティがあります。したがって、Floorがコレクションで追加、削除、移動、または変更されるたびに、Floor.Elevationプロパティを更新する必要があります。
さらに、このコレクションを編集するための UI を作成したいと考えています。各フロアがその高さとその他のプロパティと共にコントロールの行としてリストされているDataGridコントロールを使用することを考えていました。ユーザーは、コントロールを使用してフロアを追加、削除、並べ替えできる必要があります。これをできるだけ簡単かつ柔軟に設定したいと思います。つまり、Floor のコレクションをDataGridにバインドし、 Floorのプロパティに基づいてDataGridの列を設定できるようにしたいということです。クラス。可能であれば、コレクションとDataGridの間に一連のイベント関係を設定する必要なく、 DataGrid コントロールの組み込みの追加/削除 UI インターフェイスを利用できるようにしたいと考えています。
将来的に事態をさらに複雑にするために、ユーザーがフロアにカスタム プロパティを動的に追加できるようにする必要があります。これらのプロパティは、 DataGridでも表示および編集できるようにする必要があります。FloorクラスにIExtenderProviderを実装させることで、それを行うことになると思います。したがって、最終的にDataGridは次のようになります。
初期プロパティ 将来のカスタム ユーザー プロパティ 標高 ProgramType UnitType UnitCount 15' 70' レジデンシャル ラグジュアリー 5 15' 55' レジデンシャル ラグジュアリー 5 15' 40' 住宅予算 10 20' 20' 小売 該当なし 2 20' 0' 小売 該当なし 3
私の質問は、この機能を可能にするために、 FloorListコレクションを何に基づいて作成する必要があるかということです。私が検討しているオプションは次のとおりです。
1) リスト(フロア)から継承
- Add/Remove などのメソッドは仮想的ではないため、それらをオーバーライドして標高を更新することはできません
2) IList(フロア) を実装する
OnChange イベントは組み込まれていないため、リストが変更された場合、DataGrid は更新されません (私は思いますか?)
これがおそらく最良の選択肢だと思いますが、FloorListコレクションまたはDataGridへの変更が互いに同期されるようにするにはどうすればよいでしょうか?
3) BindingList(Floor) から継承
- 追加/削除などのメソッドは仮想ではないため、それらを変更して床の高さを更新することはできません。
4) IBindingList を実装する
- IBindinglist はジェネリックではなく、コレクションにFloorオブジェクトのみを含めたい