在导航中发送一个对象



我正在使用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没有其他用途,该服务可能更合适。

编辑

最新更新