我有以下型号:
人
public class Person {
private String name;
private Set<Phone> phones;
// setters and getters
}
我的ViewModel有以下filds:
public class PersonViewModel {
private Person selected;
private Phone selectedPhone;
// setters and getters for fields
@Command
public void save() {
// basically persists selected field
}
// additional commands
}
我的视图会创建一个表单,如:
<groupbox form="@id('fx') @load(vm.selected) @save(vm.selected, before='save')">
并将文本框中的名称和列表框中的电话公开。每当我选择手机时,我都会将属性设为selectedPhone。可以使用我视图中的其他文本字段编辑手机。
当我更改名称时,我的表单的脏状态会更新,这很好。当我选择手机时,我可以看到我的viewmodel的属性selectedPhone已设置。但是当我使用绑定到selectedPhone的editBox更改手机时,我的表单的脏状态不会改变。
这是预期的,因为我正在更改ViewModel而不是表单。但是解决这个问题的方法是什么,因为当手机被更换时,意味着人也会被改变,因为有些东西需要保存?
视图实现如下:
...
<groupbox form="@id('fx') @load(vm.selected) @save(vm.selected, before='save')" vflex="1">
<textbox width="50px" value="@bind(fx.name)" />
<listbox vflex="true" model="@load(fx.phones)" selectedItem="@bind(vm.selectedPhone)">
<!-- shows the phone record -->
</listbox>
<textbox width="50px" value="@bind(vm.selectedPhone.number)" />
</groupbox>
....
当我更改名称时,它会更新表单(fx)并且其状态为脏。但是更改selectedPhone.number它不会传递表单,因此它没有标记为脏。电话是一个集合,如果fx集合中包含的电话属性被更改,如何在GUI中显示并将整个表单标记为脏?
答案 0 :(得分:2)
在考虑了一下情况后,对我来说有一个简单的解决方案,
只需添加一个额外的对象,因为您的问题是您无法访问fx
,
所以我们只创建一个容器,这样你就可以在更改集合中的某些内容时访问新的fx
。
public class MyPersonContainer {
private Person selected;
private Phone selectedPhone;
//getter/setter
}
并更改您的VM
public class PersonViewModel {
//private Person selected;
//private Phone selectedPhone;
private MyPersonContainer container;
...
}
以及您的观点
<groupbox form="@id('fx') @load(vm.container) @save(vm.container, before='save')">
<listbox vflex="true" model="@load(fx.selected.phones)" selectedItem="@bind(fx.selectedPhone)">
...
<textbox width="50px" value="@bind(fx.selectedPhone.number)" />