Ninject: реализовать WithConstructorArgument (имя строки, обратный вызов Func <IContext, object>) - PullRequest
5 голосов
/ 29 июля 2011

У меня есть приложение MVVM WP7, в котором я пытаюсь отправить значение из одной Page / ViewModel в конструктор второй ViewModel. Я уже настроил Ninject и заставил его работать со статическим значением теста, используя строку типа:

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

Опять же, это работает со статическим значением, но мне нужно, чтобы это была переменная, выбранная пользователем. Мне сказали использовать перегрузку

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

Я думаю, что этот обратный вызов вызовет функцию в первой ViewModel и получит значение.

Но я не добился успеха, с готовностью признавая, что я не очень опытен ни в Ninject, ни в использовании аргумента обратного вызова Func. Я попытался настроить делегат и функцию для получения значения из первой ViewModel, но это выдает ошибку, говорящую, что я пытаюсь передать тип. Как именно указать этот аргумент для использования обратного вызова, и правильно ли я использовать делегат в первой ViewModel или что-то еще?

1 Ответ

5 голосов
/ 30 июля 2011

Как я уже говорил в вашем другом посте, передача аргумента 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);
     }
 }

Затем введите фабрику в команду выбора задачи и вызовите фабрику, когда задача выбрана.

...