为了解释如何使用 MVVM 创建表,我使用“联系人”表作为示例。这Contact
类可能如下所示:
class Contact {
private String firstName;
private String lastName;
// Getter/Setters
}
The Contact
类是一个实体,属于模型。 MVVM 规则规定它不应该被 View/CodeBehind 可见或使用。
相反,我会创建一个新类ContactTableRow
包裹着一个Contact
:
class ContactTableRow {
private Contact contact;
ContactTableRow(Contact contact) {
public String getFirstName() {
return contact.getFirstName();
}
// getter for Lastname
}
从概念上讲,此类属于 ViewModel 层。对于 ViewModel 来说,访问和使用模型类是合法的。
在您的 View 类/CodeBehind 中,您现在可以将这个新类用于 TableView:
class ContactsView {
@FXML
private TableView<ContactTableRow> table;
}
这也满足 MVVM 的规则,因为 View 可以使用 ViewModel 类。在您实际的 ViewModel 中,您现在可以创建一个ObservableList<ContactTableRow> items
and a ObjectProperty<ContactTableRow> selectedItem
:
class ContactViewModel {
private ObservableList<ContactTableRow> items = ...
private ObjectProperty<ContactTableRow> selectedItem = ...
// property accessor methods
}
在 View 类中,您现在可以将 viewModel 属性与表视图连接起来,如下所示:
class ContactsView {
@FXML
private TableView<ContactTableRow> table;
private ContactsViewModel viewModel = ...
public void initialize() {
table.setItems(viewModel.itemsProperty());
viewModel.selectedItemProperty().bind(
table.getSelectionModel().selectedItemProperty());
}
现在唯一要做的就是在 ViewModel 中创建一些逻辑来加载实际的Contact
从数据库中获取 s,将其转换为ContactTableRow
实例并将它们放入您的items
list.
通过这种方法,您的视图独立于实际的模型类。在这个简单的例子中,它可能看起来像ContactTableRow
类是开销,但在现实世界的用例中,这可能变得非常有用。它将表与实际模型类解耦。通过这种方式,您可以在单个表中显示来自多个实体的数据,并且如果数据结构将来发生变化,您只需要重构行类而不是整个表。
ViewModel 独立于实际的 UI 特定类。 viewModel 提供的是 UI 应该做什么的抽象定义:有一些数据的列表,并且可以选择该数据的单个项目。如何向用户呈现此数据列表与 ViewModel 无关。
视图可以取代TableView
with a ListView
或将来的其他组件,而无需更改 ViewModel。
您可以在示例部分找到此方法的示例mvvmFX https://github.com/sialcasa/mvvmFX图书馆:联系人示例 https://github.com/sialcasa/mvvmFX/tree/develop/examples/contacts-example包含一个主从 https://github.com/sialcasa/mvvmFX/tree/develop/examples/contacts-example/src/main/java/de/saxsys/mvvmfx/examples/contacts/ui/master使用此技术的视图。