1

我有以下模型:

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 中显示并将整个表单标记为脏?

4

1 回答 1

2

在考虑了一下情况后,对我来说有一个简单的解决方案,
只需添加一个额外的对象,因为您的问题是您无法访问fx
所以我们只是制作了一个容器,这样您就有了一个新的容器,fx当您更改时可以访问它你收藏的东西。

public class MyPersonContainer {
  private Person selected;
  private Phone selectedPhone;
  //getter/setter
}

并更改您的虚拟机

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)" />
于 2013-03-22T20:25:19.137 回答