【发布时间】:2016-12-23 23:12:53
【问题描述】:
基本新手问题:
我想同步/绑定两个表。
为了使示例简单,我使用了两个单独的表视图。这需要使用片段和范围来完成,我认为这会使问题复杂化,因为我遇到了一个基本问题。
行为:单击表 1 的同步按钮时,我希望 表 1 选择的数据覆盖相应的表 2 数据。反之亦然
人物模型:
class Person(firstName: String = "", lastName: String = "") {
val firstNameProperty = SimpleStringProperty(firstName)
var firstName by firstNameProperty
val lastNameProperty = SimpleStringProperty(lastName)
var lastName by lastNameProperty
}
class PersonModel : ItemViewModel<Person>() {
val firstName = bind { item?.firstNameProperty }
val lastName = bind { item?.lastNameProperty }
}
人员控制器(虚拟数据):
class PersonController : Controller(){
val persons = FXCollections.observableArrayList<Person>()
val newPersons = FXCollections.observableArrayList<Person>()
init {
persons += Person("Dead", "Stark")
persons += Person("Tyrion", "Lannister")
persons += Person("Arya", "Stark")
persons += Person("Daenerys", "Targaryen")
newPersons += Person("Ned", "Stark")
newPersons += Person("Tyrion", "Janitor")
newPersons += Person("Arya", "Stark")
newPersons += Person("Taenerys", "Dargaryen")
}
}
人员列表视图:
class PersonList : View() {
val ctrl: PersonController by inject()
val model : PersonModel by inject()
var personTable : TableView<Person> by singleAssign()
override val root = VBox()
init {
with(root) {
tableview(ctrl.persons) {
personTable = this
column("First Name", Person::firstNameProperty)
column("Last Name", Person::lastNameProperty)
columnResizePolicy = SmartResize.POLICY
}
hbox {
button("Sync") {
setOnAction {
personTable.bindSelected(model)
//model.itemProperty.bind(personTable.selectionModel.selectedItemProperty())
}
}
}
}
}
另一个人列表视图:
class AnotherPersonList : View() {
val model : PersonModel by inject()
val ctrl: PersonController by inject()
override val root = VBox()
var newPersonTable : TableView<Person> by singleAssign()
init {
with(root) {
tableview(ctrl.newPersons) {
newPersonTable = this
column("First Name", Person::firstNameProperty)
column("Last Name", Person::lastNameProperty)
columnResizePolicy = SmartResize.POLICY
}
hbox {
button("Sync") {
setOnAction {
newPersonTable.bindSelected(model)
}
}
}
}
}
}
【问题讨论】:
-
只是为了确定,当您点击同步按钮时,您只是想在两个表中选择相同的选项?
-
是的。相应的模型也会得到更新
-
好的。快速说明:您在两个视图中都注入了相同的模型,并在两者上调用
bindSelected。请注意,bindSelected调用应该调用一次,而不是在您单击操作时调用。所做的只是确保表选择将更新模型 - 不是在您调用 bindSelection 时,而是在选择发生时。不完全确定您的实际用例,但让我尝试重写一下。 -
最后一件事 - 您真的希望更改仅在您单击按钮时发生,还是应该自动发生?
-
好吧,用例是,我有两个布局相同但数据不同的表。我想比较该数据(逐行)并选择正确的数据(通过单击同步按钮。注意同步按钮同步相应的选定行)。由于布局相同,我创建了一个 Person 和 PersonModel 来映射数据