2011-01-10 118 views
1

這是我第一次嘗試MVVM。我的應用程序的核心是基於鬆散的Josh Smith的msdn文章。而且我也使用mvvm light框架。wpf mvvm使用命令在視圖模型之間傳遞參數

我有一個主窗口,其中包含一個命令列表區和一個工作區,它將用戶控件/視圖顯示爲tabitems,每個用戶控件都有一個相應的視圖模型。 mainWindow也有一個包含我的命令列表的視圖模型,而工作空間視圖模型有一個基本工作空間視圖模型。

我的默認視圖有一個MappingSets主數據網格,可以有一個選定的項目。這些命令啓動新的tabitems,其中包含基於所選項目處理MappingSet細節的視圖。我有一個View/ViewModel,根據使用的命令應該返回一個tabitem用於創建一個沒有現有數據的新MappingSet,或者一個tabitem包含所選項目的細節以供編輯,或者一個tabitem包含選定項目的詳細信息新的MappingSet的基礎。

在設置場景之後,我沒有設法解決的方法是傳遞參數的命令相關方式,例如所選MappingSet對象的標識符,以上述三種狀態之一實例化我的viewmodel?例如,mvvmlight messenger會適合這項任務嗎?

回答

1

這是messenger/eventaggregator的完美場景。但是,您的消息鏈可能有點複雜。根據我的理解,您的主窗口包含一個命令列表(如菜單或功能區)。這是我如何看到事件的鏈條。

  1. 您選擇從數據網格中的MappingSet,這導致要發射的MappingSetSelected消息(具有選定的MappingSet的有效載荷)
  2. 主窗口偵聽該消息並存儲該當前選擇的MappingSet
  3. 當用戶點擊按鈕時,會觸發「EditMappingSet」或「CreateNewMappingSet」消息(或者如果窗口負責創建新視圖,則它自己創建它們)。
0

如果只有三個選項,您可以讓它們綁定到三個不同的命令,並在命令內傳遞您的自定義變量。

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

我的解決方案將Messenger將數據提供給包含命令的mainWindow View模型,然後將其作爲參數傳遞給該命令啓動的ViewModel。所以結合史蒂夫和邁克的答案。 – 2011-01-13 03:10:59

相關問題