我正在 JavaFX 中使用 MVVM 模式创建
TreeView
。例如,我不明白是否应该在 ModelView
中使用 TreeItem
class MyViewModel {
private final TreeItem<Model> rootItem = ...;
}
或
TreeItem
只能在 View
中使用。
有人能说一下,MVVM 模式中
TreeItem
用在哪里吗?
TreeItem
是一件有趣的事情。 它不是 Node
,但它响应某些 Events
并且可以包含 Nodes
。 这意味着它不仅仅是数据。
一般来说,在MVVM中,ViewModel包含Presentation Data,Presentation Data应该是适合在View中绑定的形式。 在 JavaFX 中,这意味着
Observables
和 ObservableLists
。 因此,呈现数据隐含地“暴露”于视图的本质,但只是它是 JavaFX 中的 GUI。
如果您的演示数据中有
StringProperty
,仍然无法知道视图将如何使用它。 它可以与 textProperty()
、Label
、TextField
或 CheckBox
或 TextArea
的 Text
结合。 StringProperty
可以被认为是 Observable
原始类型。
但是,
TreeItem
意味着视图中的TreeView
。 您无能为力。 如果您想通过 Node
将某种特殊的 TreeItem
放入 setGraphic()
中怎么办? 你绝对不能在 ViewModel 中创建 Nodes
。
MVVM(或 MVC)的最大问题始终是:“我可以在不影响其他组件的情况下更改此组件的内部实现吗?”。 答案应该总是“是!”,如果不是,那么你就搞砸了 MVVM/MVC 实现。
那么,如果您的 ViewModel 中的演示数据中有
ObservableList<TreeItem>
,您可以在不影响 ViewModel 的情况下更改 View 的实现吗? 如果您用其他东西替换 TreeView
则不会。 即使您改变 TreeView
的性质或结构也不会。 您与视图和 TreeView
的实现息息相关。
另一方面,您必须小心,无论您在演示数据中创建什么结构来保存
TreeView
的信息,都允许视图将该数据转换为 TreeItems
,而不需要太多工作它跨越了界限进入了属于模型的“业务逻辑”。
这意味着您必须以某种通用方式在数据中实现父<-->子关系,并且视图中的代码需要能够解释它以创建
TreeItems
。
所以简短的回答是,“不,你不应该将
TreeItems
放入 ViewModel 中”。