MVVM и создание управления - PullRequest
2 голосов
/ 04 марта 2011

Представьте себе простой сценарий с окном WPF, содержащим кнопку и некоторое свободное пространство.Нажатие на кнопку создает новый пользовательский / пользовательский элемент управления и размещает его где-то случайным образом в окне.

Нажатие на один из этих элементов управления удалит его из окна.

Итак, теперь у меня есть MVMM ViewModel, который предоставляет ICommand для кнопки «Создать новый», но где находится код для создания нового элемента управления?Я думаю, что каждый элемент управления будет иметь свою собственную ViewModel, которая будет обрабатывать его удаление и позиционирование.

Может ли это быть достигнуто без кода в окне И без реального знания View в ViewModel?

Ответы [ 2 ]

1 голос
/ 04 марта 2011

Код, который вызывает создание элементов управления , находится внутри вашей "основной" модели представления.

Код, который фактически создает элементы управления , является контейнером.

Таким образом, это будет выглядеть примерно так:

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 не связывается с такими деталями.

Конечно, это означает, что вам теперь нужен некоторый код, но с этим ничего не поделаешь, если вы сами не используете платформу, предоставляющую такие сервисы.

1 голос
/ 04 марта 2011

Это ДОЛЖНО быть выполнимо с некоторой очень осторожной привязкой данных в ItemsControl, не будучи уверенным в том, как вы добьетесь макета, но у вас будет модель родительского представления, содержащая коллекцию моделей дочерних представлений, макет затем будет предварительно сформирован ItemsControl.Когда родительский ViewModel создал дочерний ViewModel, он должен внедрить RelayCommand в качестве лямбда-выражения, чтобы удалить и очистить дочерний ViewModel из родительской коллекции.

...