2015-11-03 2 views
2

Я пытаюсь реализовать приложение с помощью MVVM Light Toolkit, но я как-то застрял в ViewModelLocator.Доступ к MVVM Light ViewModelLocator из кода

Хотя мне ясно, как получить к нему доступ из представлений в XAML и кодовом представлении просмотров, у меня есть некоторые проблемы с доступом к ним из других моделей представлений.

В App.xaml:

<Application.Resources> 
    <vm:ViewModelLocatorTemplate xmlns:vm="clr-namespace:MvvmLight1.ViewModel" x:Key="Locator" /> 
</Application.Resources> 

В Вид:

DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName}" 

Но как получить доступ к примеру MainViewModel от какой-то другой модели представления? Кажется, что предыдущие выпуски фрагментов ViewModelLocator имели статический метод для разных моделей представлений. Но этого больше не существует, поэтому я предполагаю, что это не путь. Но что? Или я делаю что-то совершенно против шаблона, если я хочу получить доступ к локатору из модели представления?

ответ

9

Зависит от того, как вы настроили локатор вида, но обычно вы должны использовать контейнер IOC для регистрации всех разных ViewModels.

Например, при использовании одного из MVVM Light, было бы так: SimpleIoc.Default.Register<MainViewModel>();

Так что, когда это доступно, вы можете использовать его в любом другом классе - так и в другом ViewModel с помощью: SimpleIoc.Default.GetInstance<MainViewModel>();

Или, если вы сказали этому ServiceLocator вы используете SimpleIoc было бы так: (регистрирующий) ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

И получить его обратно ServiceLocator.Current.GetInstance<MainViewModel>();

+1

Да, такой код находится внутри ViewModelLocator. Итак, ваше предложение - использовать SimpleIoc напрямую, а не класс ViewModelLocator? – MuhKuh

+1

Да, потому что именно поэтому вы добавили Ioc в первую очередь :) для «инъекции», чтобы использовать эти экземпляры класса в любом другом классе. – Depechie

+4

psst прием ответа будет приятным :) – Depechie

1

Ответ Depechie верен, предполагая, что вы используете контейнер IoC для извлечения ViewModels так же, как и ViewModelLocator.

Однако я предлагаю другой метод, который будет получать ViewModel так же, как это делается в вашем XAML.

XAML (Page.xaml)

DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName}" 

код (Page.xaml.cs)

this.DataContext = App.Current.Resources["Locator"] as ViewModelLocator).ViewModelName 

Вышеуказанные куски XAML и кода эквивалентны. Надеюсь, это поможет вам раскрыть процесс, который приложение сделает для получения ViewModels.

Смежные вопросы