eConti - программирование в вопросах и ответах

Как обрабатывать внедрение зависимостей с помощью mvvmlight

я понятия не имею, как ввести параметр в вызов конструктора MainWindowViewModel. Что я хочу, так это зарегистрировать экземпляр текущего основного окна (это) в viewmodellocator. Как я могу это сделать?

Это моя ситуация в классе viewmodellocator:

public ViewModelLocator()
{
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

    //SimpleIoc.Default.Register<Window>();  //THIS IS NOT WORKING BECOUSE ITS A NEW INSTANCE, I NEED THE INSTANCE OF THE CURRENT MAINWINDOW HERE.
    SimpleIoc.Default.Register<MainWindowViewModel>();
}

MainViewModel:

public MainWindowViewModel(Window window)
{
    this.Window = window;

    //Listen out for the window resizing
    this.Window.StateChanged += StateChanged;
}

MainWindow.xaml

DataContext="{Binding MainWindow, Source={StaticResource Locator}}"

  • Кстати, вы нарушаете всю концепцию MVVM, предоставляя ссылку на представление для вашей модели представления. Модель представления не должна заботиться о представлениях. 12.06.2017

Ответы:


1

Если вы хотите, чтобы Window преобразовалось в MainWindow:

public ViewModelLocator()
{
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

    SimpleIoc.Default.Register<System.Windows.Window>(() => System.Windows.Application.Current.MainWindow as MainWindow);
    SimpleIoc.Default.Register<MainViewModel>();
}

Также обратите внимание, что вы должны привязываться только к "Main" в своем XAML:

DataContext="{Binding Main, Source={StaticResource Locator}}"
12.06.2017
  • Большое спасибо mm8! Это было именно то, что я искал. Теперь работает как шарм. Наконец-то я понял кое-что о DI. Я полагаю, что вы использовали здесь заводской шаблон. Я должен работать над этим знанием. По поводу вашего второго комментария. Я использую конфигурацию вместо соглашения, поэтому я назвал свое свойство в локаторе также MainWindow. Это не было проблемой и работает нормально. Большое спасибо за этот быстрый ответ. Я счастлива и надеюсь, что вы тоже:) 12.06.2017
  • Как видите, я только что проголосовал за mm8 и отметил его как решенный! 12.06.2017
  • Новые материалы

    ИИ для общего блага, часть вторая
    В нашем последнем блоге мы исследовали возможности ИИ для общего блага, указав на несколько инициатив по поиску действенных решений для продвижения справедливых и беспристрастных систем ИИ. По..

    Время расцвета закончилось
    Большую часть своей карьеры в индустрии программного обеспечения программисты работали с головой в песок. Успех в отрасли требует навыков презентации и обучения других. Ценность улучшенных..

    Будущее сельского хозяйства: новый уровень производительности с современными технологиями
    По мере роста населения мира растет и спрос на продукты питания. Фермеры сталкиваются с растущим давлением необходимости повышать урожайность и максимизировать производительность, манипулируя..

    Состояние совместной фильтрации в 2022 году, часть 1
    ResBeMF: Улучшение прогнозируемого охвата совместной фильтрации на основе классификации (arXiv) Автор: Анхель Гонсалес-Прието , Авраам Гутьеррес , Фернандо Ортега , Рауль Лара-Кабрера..

    Зачем изучать PYTHON в 2022 году !
    Python — востребованный, доступный язык программирования с активным, постоянно растущим сообществом пользователей. Для тех, кто хочет сменить профессию в мире технологий с помощью..

    Решение капч с помощью Puppeteer
    Это руководство предназначено для текстовых кодов, а не для reCAPTCHA Google (см. конец этого сообщения). Требования: Антикапча или любой другой сервис по разгадыванию капчи. Модуль..

    7 встроенных библиотек Python, которые необходимо знать
    7 встроенных библиотек Python, которые необходимо знать Стандартная библиотека Python значительно упрощает жизнь программистов, предоставляя широкий набор функций. Мы выбираем несколько..