2011-01-10 12 views
1

これはMVVMで初めての試みです。私のアプリケーションのコアは、ジョシュ・スミスのmsdnの記事をベースにしています。また、私はmvvm lightフレームワークも使用しています。wpf mvvmコマンドを使用してビューモデル間でパラメータを渡す

私は、コマンドリストエリアと、ユーザコントロール/ビューをタブアイテムとして表示するワークスペースエリアを含むメインウィンドウを持っています。各ユーザコントロールには、対応するビューモデルがあります。 mainWindowには、私のコマンドリストを含むviewmodelもあります。また、workspace viewmodelsには、基本ワークスペースviewmodelがあります。

デフォルトのビューには、選択した項目を1つ持つことができるMappingSetsのマスターデータグリッドがあります。これらのコマンドは、選択したアイテムに基づいてMappingSetの詳細を処理するビューを持つ新しいタブアイテムを起動します。私はView/ViewModelを持っています。使用するコマンドに応じて、既存のデータを持たない新しいMappingSetを作成するためのTabitem、または編集用に選択した項目の詳細を含むTabitem、または選択項目を詳細に含むTabitemを返す必要があります。新しいMappingSetの基底

シーンを設定していて、私が解決できなかったのは、選択したMappingSetオブジェクトの識別子などのパラメータを渡すコマンド依存の方法で、上記の3つの状態のいずれかでビューモデルをインスタンス化しますか?たとえば、mvvmlightメッセンジャーはこのタスクに適していますか?

答えて

1

これは、メッセンジャー/イベントアグリゲータの完璧なシナリオです。しかし、あなたのメッセージチェーンはちょっと複雑かもしれません。私が理解しているところから、メインウィンドウにはコマンドのリスト(メニューやリボンのようなもの)があります。ここで私は一連の出来事を見ています。

  1. あなたはデータグリッドからMappingSetを選択するが、これはMappingSetSelectedメッセージが
  2. メインウィンドウには、そのメッセージをリッスン(選択MappingSetのペイロードで)発射されるようにすると、現在選択されてMappingSet
  3. を保存しますユーザーがボタンをクリックすると、 "EditMappingSet"または "CreateNewMappingSet"というメッセージが出されます(または、新しいビューの作成を担当するWindowが作​​成する場合は、それ自体が作成されます)。
0

オプションが3つしかない場合は、3つの異なるコマンドにバインドし、コマンド内で自己定義変数を渡すことができます。

private RelayCommand _openMappingSetCommand; 

//Command that one of your options is bound to 
public ICommand ViewMappingSetOption1 
    { 
     get 
     { 
      if (_openMappingSetCommand == null) 
      { 
       _openMappingSetCommand = new RelayCommand(param => this.DoTabRequest("your parameter"); 
      } 
      return _openMappingSetCommand ; 
     } 
    } 


// Method that creates your viewmodel 
private void DoTabRequest(parameterType parameter) 
    { 
     WorkspaceViewModel viewModel = null; 

     if (viewModel == null) 
     { 
      viewModel = (WorkspaceViewModel)Activator.CreateInstance(typeof (viewModelType), parameter); 
      this.Workspaces.Add(viewModel); 
     } 

     this.ActiveWorkspace = viewModel; 
    } 

次に、viewmodelのコンストラクタでそのパラメータを許可し、それに基づいて必要なものを実行します。

+0

私のソリューションは、コマンドを保持しているmainWindow Viewモデルにデータを提供するためにMessengerを結合し、コマンドで起動したViewModelにパラメータとして渡しました。スティーブとマイクの答えの両方を組み合わせました。 –

関連する問題