Передача параметра в конструктор ViewModel

Можно ли передать параметр конструктору ViewModel? Затем я бы использовал этот параметр для инициализации свойства и/или выполнения других операций в ViewModel.

С WinForms я мог бы сделать

public MyForm(MyParamType myParam) {
    MyFormProperty = myParam;
    //etc.
}

Как мне сделать что-то подобное в шаблоне MVVM/используя MVVM Light?

Любые предложения будут приветствоваться. Заранее спасибо.


person lazo    schedule 29.09.2010    source источник
comment
Большое спасибо всем, кто ответил. В качестве временного решения я сделал что-то вроде ((MyViewModel)MyView.DataContext).MyProperty = myParam; -- Однако в конечном итоге для обработки этого будет использоваться контейнер IoC.   -  person lazo    schedule 18.10.2010


Ответы (4)


Я бы рекомендовал использовать контейнер IoC и настроить ваш контейнер для предоставления параметра при построении.

Например, вот как выглядит для меня типичный код программной части UserControl в WPF:

public partial class MyDataGridView : IMyListView
{
    public MyDataGridView()
    {
      InitializeComponent();
    }

    public MyDataGridView(MyListViewModel viewModel)
    {
      InitializeComponent();

      DataContext = viewModel;
 }
}

StructureMap создает для меня MyListViewModel, потому что по умолчанию он ищет самый жадный конструктор, а затем предоставляет зависимости. В моей конфигурации StructureMap я могу указать, что MyListViewModel должен быть снабжен любыми параметрами, необходимыми при создании этого объекта.

С таким контейнером, как StructureMap, мне не нужно создавать новые объекты. Всегда.

person Chris Holmes    schedule 29.09.2010
comment
Проголосовал за предложение внедрения зависимостей. DI делает приложение гораздо более пригодным для модульного тестирования. - person FMM; 03.10.2010
comment
Спасибо, внедрение зависимостей, вероятно, является наиболее устойчивым способом продвижения вперед. Мне нужно выполнить небольшой рефакторинг после того, как я присмотрелся и решил, какой контейнер IoC использовать. - person lazo; 18.10.2010
comment
@lazo - в прошлый раз, когда я ходил по магазинам, я обнаружил, что Ninject для IoC понравился больше всего, но в приложении возникли проблемы с выбором лучшего способа поделиться ядром. - person jpierson; 25.06.2012

Если вы используете MVVM light (даже если это не так), вы можете зарегистрировать обработчик сообщений в Messenger, который принимает параметры вашего конструктора (или его кортеж) и обновляет виртуальную машину всякий раз, когда вам нужно «реконструировать» ее.

person Doobi    schedule 29.09.2010

Поскольку все модели представления являются статическими в локаторе, вы можете просто получить доступ к этим свойствам уже без изменения конструктора.

person Rick Ratayczak    schedule 30.09.2010
comment
Спасибо за ваш ответ. Да, в итоге я сделал что-то похожее на то, что вы предлагаете здесь в качестве краткосрочного решения. - person lazo; 18.10.2010

Я не понимаю, почему вы не можете просто создать модель представления самостоятельно. Вы всегда можете создать свою собственную модель представления. Если есть модель представления, предоставляемая MVVM Light, вы всегда можете наследовать ее и создать перегруженный конструктор.

person AlvinfromDiaspar    schedule 29.09.2010