2011-07-29 15 views
5

我有一個MVVM WP7應用程序,我試圖從一個Page/ViewModel發送一個值到第二個ViewModel的構造函數。我已經有Ninject設置和得到這個到使用符合靜態測試值的工作,如:Ninject:實現WithConstructorArgument(字符串名稱,Func <IContext,對象>回調)

this.Bind<TaskViewModel>().ToSelf().WithConstructorArgument("TaskID", 2690) 

再次,與一個靜態值的作品,但我需要的是由用戶選擇的變量。有人告訴我使用過載

WithConstructorArgument(string name, Func<IContext,object> callback). 

我會認爲這將回調調用第一視圖模型的功能和獲得的價值。

但我沒有成功,很容易承認我對Ninject或使用Func回調參數都不是很有經驗。我試着設置一個委託和函數來從第一個ViewModel獲取值,但是這給了一個錯誤,說我試圖傳入一個類型。我該如何指定該參數才能使用回調,並且我正確地在第一個ViewModel或其他內容中使用委託?

+1

你確定以這種方式使用依賴注入是個好主意嗎?我的意思是根據用戶輸入解決組件依賴關係? –

+0

這是由我認爲對Ninject非常有知識的人所推薦的,正如我在我的問題中所說的,我不是。如果您有適合MVVM的合適解決方案,我肯定會改變我的方法。 – Walter

+1

@Waltedbn:Remo Gloor是Ninject項目的當前活躍開發人員。他是世界上關於這個話題的最有見識的人。聽他的。 – StriplingWarrior

回答

5

正如我已經在你的另一篇文章中所傳遞的關於get的觀點可能是更好的方法。爲此創建一個工廠接口

public interface ITaskViewFactory 
{ 
    TaskViewModel CreateTaskViewModel(int id); 
} 

在你的引導程序(負責使用Ninject創造的一切組件,通常情況下應該是另一個人比您實現業務價值的所有內容)添加實現

Public class TaskViewFactory : ITaskViewFactory 
{ 
    Private IKernel kernel; 
    Public TaskViewFactory(IKernel kernel) 
    { 
     this.kernel = kernel; 
    } 

    public TaskViewModel CreateTaskViewModel(int taskId) 
    { 
     this.kernel.Get<ITaskViewModel>(new ConstructorArgument("TaskId", taskId); 
    } 
} 

然後將工廠注入您的任務選擇命令,並在選擇任務時調用工廠。

相關問題