TreeItem可以在JavaFX中的MVVM中的ViewModel中使用吗?

问题描述 投票:0回答:1

我正在 JavaFX 中使用 MVVM 模式创建

TreeView
。例如,我不明白是否应该在 ModelView 中使用
TreeItem

class MyViewModel {
   private final TreeItem<Model> rootItem = ...;
}

TreeItem
只能在
View
中使用。

有人能说一下,MVVM 模式中

TreeItem
用在哪里吗?

java javafx mvvm
1个回答
0
投票

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 中”。

© www.soinside.com 2019 - 2024. All rights reserved.