私は次のモデルを持っています:
人
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内に表示し、フォーム全体をダーティとしてマークするにはどうすればよいですか?