2013-08-01 5 views
2

Я работаю над приложением WPF/MVVM с использованием MVVM Light. Прямо сейчас мой ViewModelLocator довольно стандартный; он включает конструктор static, который регистрирует ViewModels через SimpleIoc и имеет свойства, возвращающие текущие экземпляры ViewModels.Вопросы относительно правильного использования ViewModelLocator в MVVM

Я не знаю, насколько это уместно, но я изучал использование экземпляров ViewModelLocator в ViewModels для доступа к свойствам других ViewModels и для изменения ContentControl в одном из моих представлений. Если есть какие-то серьезные проблемы с этим, сообщите мне, чтобы я мог найти способ обойти это. Например, я, возможно, что-то в ViewModel, как:

private ViewModelLocator _viewModelLocator = new ViewModelLocator(); 

private void SomeMethod() 
{ 
    _viewModelLocator.OtherViewModel.SomeProperty = something; 
} 

В другом ViewModel я следующее:

private ViewModelLocator _viewModelLocator = new ViewModelLocator(); 

public ViewModelBase CurrentViewModel { get; set; } 

private void SomeMethod() 
{ 
    CurrentViewModel = _viewModelLocator.SomeViewModel; 
} 

В этом случае CurrentViewModel связан с ContentControl на мой взгляд.

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


Теперь, если нет ничего плохого с вышеупомянутым подходом, я хотел бы знать, если это будет уместно и/или приемлемым сделать ViewModelLocatorstatic. Чтобы попробовать, я быстро перешел на staticViewModelLocator. В моей MainWindow.xaml, я установил DataContext на:

DataContext="{Binding Source={x:Static vm:ViewModelLocator.Main}}" 

... и вернуться к первому примеру, я могу использовать:

private void SomeMethod() 
{ 
    ViewModelLocator.OtherViewModel.SomeProperty = something; 
} 

и:

public ViewModelBase CurrentViewModel { get; set; } 

private void SomeMethod() 
{ 
    CurrentViewModel = ViewModelLocator.SomeViewModel; 
} 

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

Любые консультации по этим вопросам были бы весьма полезными. Я до сих пор довольно новичок в программировании, и я хотел бы изучить методы, которые будут хорошо служить мне в долгосрочной перспективе.

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

Спасибо.

ответ

1

Считается неверным ссылаться на другие модели просмотра на модели просмотра. Это нарушает развязку, которая, как предполагается, заставит вас проецировать более тестируемые и поддерживаемые. Если мне нужно иметь доступ к свойствам из нескольких моделей представлений, я создаю службу, такую ​​как iUniversalAppDataService, а затем использую инъекцию зависимостей, встроенную в MVVM-Light, чтобы решить, когда создается vewimodel.

т.е. это конструктор вашей ViewModel:

public New(IUniversalAppDataService AppDataService) 
{ 
    _MyAppDataService = AppDataService; 
} 

Таким образом, любые изменения/свойства в пределах этой службы доступны любому ViewModel, который реализует службу.

служба должен быть объявлен в viewmodellocator, а также:

SimpleIoc.Default.Register<IUniversalAppDataService , UniversalAppDataService > 

Я использовал этот метод для создания навигационных служб, которые отвечают пользователь навигацию и услуги передачи данных курсов из баз данных или веб-сервисов данных. Я настоятельно рекомендую использовать этот сервисный подход, потому что в будущем WAY проще поддерживать в случае изменений в вашей базовой модели данных или архитектуре приложения.

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