我正在使用Prism/Unity编写WPF/MVVM应用程序。我有关于如何传输数据从一个用户控制到另一个导航区域时的问题。
我有一个区域
这是由一个用户控件("ContactsList")填充的,它只包含一个网格,这个网格由ItemsSource &设置SelectedItem .
我想导航到ContractEdit,并将Contact绑定传递给SelectedItem。
LocalRegionManager.RequestNavigate (ContactRegions。MainRegion ContactsUri.ContactsEdit);
我可以在数据上下文或Uri中传递单个值,但当我已经在列表视图模型中拥有整个Item时,我不想回到数据库中获取数据。
我如何从列表usercontrol传递一个完整的对象到编辑控件?
提前感谢。
结论我添加了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);
}
在prism安装程序中下载的prism示例中有一个方便的示例;他们使用一个单独的文件来订阅/取消订阅事件。有桌面版和Silverlight版。
它还展示了如何创建用于取消订阅事件的令牌。
奥利你可以有一个NavigationManager来知道当前联系人是什么。你只需要设置它并获取它例如在NavigatedFrom和NavigatedTo或其他地方。它既可以在自己的模块中,也可以在核心项目中,只要CurrentContact是一个IContact。
您还可以在列表模块中设置一个服务,该服务将从其他模块访问当前联系人。
如果NavigationManager没有其他用途,该服务可能更合适。
编辑