我的 MVVM 应用程序中有两个 ViewModel。一个绑定到主窗口,另一个绑定到单击按钮后出现的弹出窗口。在弹出窗口中,我需要从主窗口绑定到选定的实体。如何从 PopupViewModel 访问 MainViewModel 中的这个实体?
问问题
6597 次
2 回答
5
ZK 具有事件队列的概念和用于多个 ViewModel 之间通信的全局命令,因此我们可以使用它将当前选定的实体传递给弹出窗口的 ViewModel。
使用这个 zk mvvm 演示页面:
(见文档)
我在列表框中添加了一个全局命令,该命令会触发当前选定的主 ViewModel 提醒,需要通过弹出窗口显示:
<listbox id="list" multiple="true" rows="6"
model="@load(vm.reminders)"
selectedItem="@bind(vm.selectedReminder)"
onSelect="@global-command('refresh', reminder=vm.selectedReminder)">
然后我在页面底部添加了一个带有第二个 ViewModel 的弹出窗口:
<window id="info" visible="false" width="120px" border="normal" position="parent"
apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('org.zkforge.zktodo2.ui.ViewModelPopup')"
>
You have selected <label value="@load(vm.currentReminder.name)"/>
</window>
<button label="More info" onClick="info.doPopup()"/>
</zk>
弹出的 Viewmodel 有一个方法,它接受将实体作为参数的全局命令:
public class ViewModelPopup {
protected Reminder currentReminder = new Reminder();
public Reminder getCurrentReminder() {
return currentReminder;
}
public void setCurrentReminder(Reminder currentReminder) {
this.currentReminder = currentReminder;
}
@GlobalCommand @NotifyChange("currentReminder")
public void refresh(@BindingParam("reminder") Reminder reminder ){
this.setCurrentReminder(reminder);
return;
}
}
因此,现在每当您在列表框中选择一个项目时,都会在弹出 ViewModel 上触发刷新方法,并将从主 ViewModel 获取的数据传递给它。每当您点击页面底部的“更多信息”按钮以显示弹出窗口时,它都会显示当前选定实体的名称。
我遵循的文档位于:
(文档1)
(文档2)
运行该示例应用程序的说明位于 ( Docs3 )的自述文件中
于 2012-07-21T20:23:18.187 回答
1
您的主窗口中有实体列表吗?如果是这种情况,则需要从主窗口的视图模型中将所选实体放在地图中,并将其作为 createComponents 的参数传递,如下所示:
//In the view Model of the main window
Map arg = new HashMap();
arg.put("selectedEntity", SelectedEntity);
Executions.createComponents("/myPopup.zul", null, arg);
现在在弹出视图模型中,您只需在 Init 方法中检索 Entity 的值:
//PopupView model
@Init
public void init(@ExecutionArgParam("selectedEntity") SelectedEntity newEntity) {
entity = newEntity;
}
您会注意到 ExecutionArgParam 中的字符串是您放入地图的键。
于 2012-07-19T12:40:03.763 回答