Недавно меня попросили преобразовать довольно большое настольное приложение в единый элемент управления, который можно добавить в другие формы / окна.В настольной версии он состоит из главного окна, которое порождает другие окна.
Существует класс ViewModelLocator, который инициализирует различные объекты и модели представления для окон и внедряет надлежащие объекты в конструкторы этих моделей представления.Вот пример того, что находится в ViewModelLocator и MainWindow.xaml:
public class ViewModelLocator
{
CustomMap Map = new CustomMap();
ObservableCollection<Styles> MapStyles = new ObservableCollection<Styles>();
public MainViewModel MainViewModel
{
get
{
if (_mainViewModel == null)
{
_mainViewModel = new MainViewModel(Map, Styles);
}
return _mainViewModel;
}
}
}
Вот как основное окно устанавливает его текстовый текст:
<Window x:Class="DesktopApp.MainWindow"
DataContext="{Binding Path=MainViewModel, Source={StaticResource ViewModelLocator}}"
</Window>
И это в App.xaml для добавленияViewModelLocator как ресурс:
<Application.Resources>
<vm:ViewModelLocator x:Key="ViewModelLocator" />
</Application.Resources>
Есть несколько других моделей представления и окон, настроенных таким же образом.Все они совместно используют различные объекты, которые инициируются в viewmodellocator, когда локатор вводит эти объекты в конструкторы моделей представления.
Основная проблема заключается в том, что когда я конвертирую это приложение в usercontrol, мне нужно избавитьсяиз App.xaml, который также забирает viewmodellocator, если я не сделаю все в нем статичным или не сделаю какую-то одноэлементную его версию.
Каков наилучший способ инициализации этих моделей представления и обмена данными между ними?Должен ли я поместить все в код MainWindow (теперь это пользовательский контроль), поскольку сейчас это точка входа?
Я бы хотел, чтобы это максимально соответствовало шаблону MVVM.