Код, который вызывает создание элементов управления , находится внутри вашей "основной" модели представления.
Код, который фактически создает элементы управления , является контейнером.
Таким образом, это будет выглядеть примерно так:
void AddControlCommandExecuted() {
var container = // resolve your DI container here
// Now use the container to resolve your "child" view. For example,
// if using UnityContainer it could go like this:
var view = container.Resolve<ChildView>();
// Of course you can also resolve the ViewModel if your program is
// "ViewModel-first" instead of "View-first".
// Does the ChildViewModel need some properties to be set?
var viewModel = (ChildViewModel)view.DataContext;
viewModel.StringProperty = "blah";
// Now get a reference to the region in your View which will host
// the "child" views.
var regionManager = container.Resolve<IRegionManager>();
var region = regionManager.Regions["MyRegionName"];
// Finally add the view to the region. You can do it manually, you
// can use the concept of "navigation" if your MVVM framework has one
// (I 'm using Prism, which does), etc etc.
region.Add(view);
}
Обновление: При написании ответа я забыл, что не во всех средах MVVM есть Regions, как в Prism.Извините за специфику приведенного выше кода, так как он ничего не меняет.Вам просто нужно создать что-то вроде региональной абстракции самостоятельно.Давайте посмотрим:
class MyViewModel {
public event EventHandler<ChildViewModelAddedEventArgs> ChildViewModelAdded;
}
MyView
затем прикрепит обработчик события к этому событию и подберет экземпляр ChildView
изнутри ChildViewModelAddedEventArgs
, чтобы его можно было добавить к ItemsControl
itявляется родителем того, что ваша ViewModel не связывается с такими деталями.
Конечно, это означает, что вам теперь нужен некоторый код, но с этим ничего не поделаешь, если вы сами не используете платформу, предоставляющую такие сервисы.