2

Prism/Unity を使用して WPF/MVVM アプリケーションを作成しています。領域をナビゲートするときに、あるユーザー コントロールから別のユーザー コントロールにデータを転送する方法に問題があります。

私は地域を持っています

これは、グリッドのみを含むユーザー コントロール ("ContactsList") によって入力されます。このグリッドは、ItemsSource および SelectedItem によってバインドされます。

ContractEdit に移動し、SelectedItem にバインドされた Contact を渡したいです。

LocalRegionManager.RequestNavigate(ContactRegions.MainRegion, ContactsUri.ContactsEdit);

Datacontext または Uri で単一の値を渡すことができますが、リスト ビュー モデルにアイテム全体が既にある場合、データを取得するためにデータベースに戻る必要はありません。

リスト ユーザー コントロールからエディット コントロールにオブジェクト全体を渡すにはどうすればよいですか?

前もって感謝します。

結論

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);
    }
4

2 に答える 2

0

プリズムのインストーラーでダウンロードされるプリズムのサンプルには、この便利な例があります。イベントの購読/購読解除に別のファイルを使用します。デスクトップ版と Silverlight 版があります。

また、イベントの購読を解除するために使用されるトークンを作成する方法も示しています。

オリ

于 2013-05-24T11:30:48.073 に答える
0

現在の Contact が何であるかを知る NavigationManager を持つことができます。たとえば、NavigatedFrom と NavigatedTo、または他の場所で設定して取得するだけです。CurrentContact が IContact である限り、それ自体のモジュールまたはコア プロジェクトのいずれかにすることができます。

他のモジュールから現在の連絡先にアクセスするサービスをリスト モジュールに含めることもできます。

NavigationManager に他の目的がない場合は、このサービスの方が適している可能性があります。

編集

これらのサービスは msdn で説明されています。

于 2013-05-22T16:54:14.087 に答える