我有一个自定义树数据类,遵循标准 Composite图案。我显然不希望 GUI 和模型联系得太紧密,所以 GUI 应该是 Observer模型的变化,应该通过模型层来完成。我正在使用 C# 事件实现可观察支持 - 到目前为止一切顺利,并且我有一个工作系统。
- 您希望可观察树生成哪些事件? NodeCreate、NodeDelete、NodeMove?
- 您会创建单个
TreeChange
事件并在TreeChangeEventArgs
中对更改信息进行编码,还是会为每个更新类型创建一个事件(可能连同每个更新类型的特定 EventArg 类) )? NodeDeleting
还是NodeDeleted
?如果没有将已删除的节点作为参数,NodeDeleted
对我来说似乎用处非常有限?当然,树可以在(可能)处理 Node 之前触发NodeDeleted
事件,但是抛出(至少在概念上)已删除的 Node 是一种好习惯吗?- 当删除一个包含子节点的节点时,您希望得到单个
NodeDeleted
事件,还是子节点的递归NodeDeleted
事件?单个NoteDeleted
对我来说似乎没问题,但也许有些情况我没有考虑过。 - 单个节点的变化,而不是树结构的变化。我假设最好通过让各个节点可见来处理这个问题? (我目前正在节点类上使用 INotifyPropertyChanged 来处理这个问题)。
- 不,我不想使用
Windows.Forms.TreeView
作为我的主要数据结构:)
还有一个额外的问题:让客户端直接操作树节点并让树本身触发事件,或者按照 Service.Instance.AddNode(parentNode, "New node name")
并让服务类负责生成事件?
最佳答案
- 我肯定会添加 NodeChange,如果树不能在节点中存储值,那它有什么用呢?其他事件取决于树应支持的所有内容,例如对于自平衡树,您可以使用 NodeRotate 事件等。绝对允许引入自定义事件以供将来使用。
- 我更喜欢基于 OO 原则的设计,例如多态行为,所以不同的子类是我的答案。
- 此事件对 UI 很重要,解决您的难题的简单方法是向节点添加某种 id,这样树模型中已删除的节点可以隐藏在 UI 中。
- 取决于您的删除语义,例如您可能想要删除单个节点并将其所有子节点连接到已删除节点的父节点。然而,对于复合结构,单个递归删除似乎更合理。
- 你必须考虑节点和树之间的关系。我更喜欢节点的特殊事件,它会在需要时生成树事件。
- 我不是 .Net 专家,但总是考虑是否无法调整现成的内容以满足您的要求。
奖励:我认为属于树的行为应该在树中,要改变它你有多态性和继承性,不要使用 OO 在 OO 系统中更有意义的结构设计。
关于c# - 可观察树 - 哪些事件会发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3676108/