我有以下模型:
人
public class Person {
private String name;
private Set<Phone> phones;
// setters and getters
}
我的 ViewModel 有以下字段:
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。可以通过在我的视图中使用其他文本字段来编辑电话。
当我更改名称时,我的表单的脏状态会更新,这很好。当我选择电话时,我可以看到我的视图模型的属性 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 它不会通过表单,因此它没有被标记为脏。Phones 是一个集合,如果 fx 集合中包含的 phone 属性发生更改,如何在 GUI 中显示并将整个表单标记为脏?