2012-08-06 26 views
0

我該如何解決從控制器ViewModel的命令?從Controller解析ViewModel的命令? (PRISM)

現在,我不得不通過構造函數依賴注入UnityContainer到ViewModel中,並使用字符串解析ICommand。我真的不想將容器傳遞給我的視圖模型,並希望將其保存在我的控制器中。

這些只是片段,而不是全部。儘管我在嘗試學習,但並不是說他們是複雜的課程。


視圖模型

private ICommand loadedCommand; 
    public ICommand LoadedCommand 
    { 
     get { return loadedCommand; } 
     set 
     { 
      loadedCommand = value; 
      RaisePropertyChanged(() => this.LoadedCommand); 
     } 
    } 

    public MainViewModel(IUnityContainer container) 
    { 
     LoadedCommand = container.Resolve<ICommand>("LoadedCommand") 
    } 

控制器

DelegateCommand LoadedCommand; 
    new DelegateCommand(() => ViewLoaded()); 

控制器

 Container.RegisterInstance<ICommand>("LoadedCommand", LoadedCommand); 

我甚至不知道我是否正在以正確的方式進行。我有點立刻潛入一切,Prism和Dependency Injection和mvvm(帶控制器)對我來說都是比較新的。

+0

控制器是否擁有ViewModel的ICommand?我會認爲是的,因爲我被告知ViewModel不應該有任何邏輯。當每個ICommand不同時,如何將控制器的DelegateCommand注入到ViewModel中?我是否爲每個Command創建一個接口?理想情況下,我想在我的模塊中創建自己的類中的命令。 – Cowman 2012-08-08 00:25:09

+0

我知道我可以像這樣將[Dependency]屬性添加到LoadedCommand屬性中。 [依賴(「LoadedCommand」)] 現在我可以擺脫ViewModel必須知道UnityContainer。 這是理想嗎?有沒有另一種方式我應該考慮這樣做? – Cowman 2012-08-08 02:30:51

+0

我仍然在尋求這個問題的答案。最簡單的說,我想知道「如何在控制器中設置ViewModel ICommands中的代碼」的正確方法。 我看過很多HiTech Magic的帖子都在談論這個,但他並沒有真正討論去做這個。我不知道是否需要依賴注入,如果只需要通過直接在控制器中訪問屬性來設置。 我買了「依賴注入.NET」希望找到答案。 – Cowman 2012-08-12 06:27:17

回答

0

我可能不完全確定你的問題。但是我理解MVVM中的命令的方式是:您有視圖,而不是使用命令對象的單擊事件。

原因是,點擊事件進入代碼隱藏,使用命令,而您有能力將邏輯傳輸到視圖模型。

視圖使用綁定連接到視圖模型。

那麼短的例子:
(用途):

<Element Property="{Binding PropertyNameInTheViewModel}" /> 

(例):

<Button Command="{Binding ClickCommand}" /> 

然後當然使視圖的的DataContext到視圖模型。示例(在代碼隱藏完成):

public partial class View : Window 
{ 
    public View(ViewModel vm) 
    { 
     InitializeComponent(); 
     this.DataContext = vm: 
    } 
} 

在視圖模型

public ICommand ClickCommand { get; set; } 

#region constructor 
public Viewmodel() 
{ 
    ClickCommand = new DelegateCommand(ButtonClick); 
} 
#endregion 

private void ButtonClick() 
{ 
    // handle the click 
} 

我不完全相信你的「控制器」的意思。我學習的設計模式是View - > ViewModel - > Model。並在視圖構造函數中使用依賴注入來傳遞視圖模型。就我個人而言,我正在學習MEF(管理可擴展性框架)而不是Unity。

+0

我一直在嘗試使用MVCVM模式,這是我從HiTechMagic在stackoverflow上學到的。基本上,控制器創建視圖和模型,將視圖模型分配爲視圖的datacontext,並初始化並更改ViewModel的所有值。視圖模型除了呈現要被視圖消費的信息之外什麼也不做。 其中有我的問題......我只是分配控制器中的所有值,還是有更乾淨,封裝的方式呢?這基本上是我想弄明白的。 – Cowman 2012-09-02 04:17:28

+0

我個人認爲把一個額外的「控制器」,是不正確的路要走。只是因爲控制器的目的(正如他們所描述的)將成爲view和vm之間的中間人。但是這不是必須的,因爲你可以使用綁定...爲什麼要進行額外的步驟?如果你在Prism中使用依賴注入,你可以從viewmodel/module中去,然後用一個區域註冊視圖。 – Johnny 2012-09-03 04:43:07

+0

總結:(在我看來)我不會使用這種方法。 而在棱鏡/ DI中,我將在視圖模型中定義命令 - 無需在構造函數中傳遞它們。 – Johnny 2012-09-03 04:50:52