Передача параметров в ViewModels (Prism) - PullRequest
3 голосов
/ 26 марта 2010

Я не могу понять, как передать параметры моим моделям представления из других представлений или моделей представления.

Например, у меня есть представление под названием «Клиенты». Внутри есть сетка, и если вы дважды щелкните сетку, то должно появиться новое представление, которое позволит вам редактировать данные этого клиента. Но как View (Модель), ответственная за редактирование данных, узнает, какого клиента он должен открыть, если я не могу передать какие-либо параметры внутри?

EventAggregator не может быть и речи, потому что я, очевидно, не могу создать сотни eventargs, каждый для одного представления. И кроме того, это паршивое решение.

Пока я смог придумать:

CustomerDataView custView = new CustomerDataView(customerId, currentContext);
manager.Regions[RegionNames.Sidebar].AddAndActivate(custView);

Что вы думаете об этом конкретном решении? Это нормально? Что мне не нравится в этом, так это то, что я проигрываю при автоматическом внедрении зависимостей в Unity.

Ответы [ 2 ]

5 голосов
/ 30 марта 2010

Кроме того, вы можете обновить Unity до последней сборки, которая поддерживает «Переопределения параметров».

MyType mt = container.Resolve<MyType>(
                      new ParameterOverride("customerId", customerId));

Это то, что я сделал. Мы обнаружили, что субконтейнеры поддерживают циклическую ссылку на своих родителей и не собирают должным образом (утечка памяти), поэтому мы обновили и выбрали этот метод.

3 голосов
/ 26 марта 2010

Вот для чего M в MVVM. Например. иметь модель, которая разделяется (внедряется Unity в конструктор) сеткой клиентов и редактором клиентов. Когда в гирде происходит двойной щелчок, в модели устанавливается экземпляр Customer. Когда представление редактора создано, его viewmodel получит Customer из модели.

Что касается потери автоматического внедрения зависимости, которую вы упомянули, вы можете использовать метод CreateChildContainer (). E.g.:

using (var childContainer = _container.CreateChildContainer())
{
    childContainer.RegisterInstance(customerId);
    var custView = childContainer.Resolve<CustomerDataView>();
    manager.Regions[RegionNames.Sidebar].AddAndActivate(custView);
}
...