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にバインドされた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内に表示し、フォーム全体をダーティとしてマークするにはどうすればよいですか?

4

1 に答える 1

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