Я создал Тестовое приложение MVVM , которое во время выполнения читает файл XML для динамического создания меню и, исходя из того, что выбрал пользователь, загружает в UserControl этой страницы динамически . В результате получается хороший шаблон MVVM, который позволяет вам иметь одну пару View / ViewModel на страницу , определенную в файле XML. Очень мило.
Так что теперь я просто добавил для разработчика возможность создать кнопку на одной странице, которая переходит на другую страницу . Я делаю это в MainViewModel. Я создаю коллекцию ViewModel в ObservableCollection, и когда я создаю каждый из них, я внедряю саму MainViewModel (this) в каждый конструктор UserControl-ViewModel, Таким образом, каждый UserControl имеет внутри себя MainViewModel, чтобы разработчик мог манипулировать приложением (например, вызывать SwitchPage (idCode)) через MainViewModel.
Также любое глобальное состояние , которое мне нужно сохранить, я могу сохранить в MainViewModel, к которой имеет доступ каждый UserControl.
Кроме того, каждый UserControl (PageItem) имеет полный доступ ко всем остальным UserControls , что дает мне в основном контроль над всем в приложении из любого UserControl, чего я пытался добиться в MVVM приложение в течение длительного времени.
Так что мой вопрос: Является ли этот вид внедрения ViewModel полезным / известным шаблоном или есть проблемы с внедрением ViewModel в его дочерние ViewModels? Мне кажется, что это рекурсивно, но, кажется, работает нормально мне функциональность, которую я хочу до сих пор. Из того, что я узнал из архитектуры библиотеки составных приложений, похоже, что здесь происходит нечто подобное, например: в приведенном ниже коде я могу добавить другие объекты приложения в мои модели ViewModel по мере необходимости.
public MainViewModel()
{
PageItems pageItems = PageItems.Create("all");
foreach (PageItem pageItem in pageItems.Collection)
{
string assemblyName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
string viewModelName = assemblyName + ".ViewModels.PageItem" + StringHelpers.ForcePascalNotation(pageItem.IdCode) + "ViewModel";
var type = Type.GetType(viewModelName);
var viewModel = Activator.CreateInstance(type, this, pageItem) as ViewModelPageItemBase;
AllPageItemViewModels.Add(viewModel);
}
CurrentPageItemViewModelIndex = 0;
LoadCurrentPageItemViewModel();
}