我正在使用Prism / Unity编写WPF / MVVM应用程序 . 我在导航区域时遇到了如何将数据从一个用户控件传输到另一个用户控件的问题 .
我有一个地区
这由仅包含网格的用户控件(“ContactsList”)填充,该网格由ItemsSource和SelectedItem绑定 .
我想导航到ContractEdit并将Contact绑定传递给SelectedItem .
LocalRegionManager.RequestNavigate(ContactRegions.MainRegion,ContactsUri.ContactsEdit);
我可以在Datacontext或Uri中传递单个值,但是当我已经在列表视图模型中拥有整个Item时,我不想返回数据库来获取数据 .
如何将整个对象从列表usercontrol传递到编辑控件?
提前致谢 .
Conclusion
我添加了EventAggregator
public ListViewModel(IEventAggregator eventAggregator, IRegionManager regionManager)
{
_eventAggregator = eventAggregator;
_regionManager = regionManager;
}
即使在航行时也能发布
private void OnSendData()
{
_regionManager.RequestNavigate(ShellRegions.LeftRegion, ModuleAUris.Edit);
_eventAggregator.GetEvent<UserEvent>().Publish(_selectedItem);
}
然后订阅了偶数来获取对象 .
public EditViewModel(IEventAggregator eventAggregator, IRegionManager regionManager)
{
_regionManager = regionManager;
_eventAggregator = eventAggregator;
BackCommand = new DelegateCommand(OnBack);
_eventAggregator.GetEvent<UserEvent>().Subscribe((e) => UserEntity = e);
}
2 回答
在使用prism安装程序下载的棱镜示例中有一个方便的例子;他们使用单独的文件订阅/取消订阅活动 . 有一个桌面和Silverlight版本 .
它显示了如何创建用于取消订阅事件的令牌 .
奥利
您可以拥有一个能够知道当前联系人的NavigationManager . 您只需设置它并在NavigatedFrom和NavigatedTo或其他地方获取它 . 只要CurrentContact是IContact,它可以位于自己的模块中,也可以位于核心项目中 .
您还可以在列表模块中拥有一个服务,该服务将访问其他模块的当前联系人 .
如果导航管理器没有其他用途,则该服务可能更合适 .
edit
这些services在msdn上解释 .