Инъекция вида из одного модуля в другой вид во втором модуле - PullRequest
0 голосов
/ 30 апреля 2011

Мне нужна помощь, чтобы понять, как внедрить представление из одного модуля в другое представление во втором модуле, используя библиотеку Prism.

У меня есть CreateOrderView внутри моего модуля Order.Это представление внедряется в область в Shell.Теперь мне нужно отобразить PersonCardView внутри этого CreateOrderView.PersonCardView - это представление из моего PhoneBookModule.

Модель представления PersonCardView принимает аргумент Person в конструкторе, который содержит данные, которые будет отображаться в представлении.

В моем CreateOrderView как определить«заполнитель» для «инъекции» этого PersonCardView?Я не думаю, что было бы уместно определять регион здесь, так как это всегда единый взгляд, и ничего более.Если бы два представления были в одном и том же модуле, я мог бы просто включить его следующим образом:

<PersonCardView DataContext="{Binding PersonCardViewModel}"/>

CreateOrderViewModel, конечно, будет содержать свойство PersonCardViewModel, содержащее модель представления для PersonCardView.Я не могу понять, как это сделать, если я не создаю ссылку между двумя модулями, и я бы хотел этого избежать.

Есть идеи?Как вы подошли к этому вопросу?

1 Ответ

1 голос
/ 02 мая 2011

У меня есть два варианта, которые я вижу.

Ваш первый вариант - использовать регионы . Регионы в порядке с одним контролем:

<ContentControl RegionManager.Region="MyCrossModuleRegion" />

Это будет хорошо работать. Ссылка между ними не требуется.

Второй вариант заключается в том, чтобы модуль, который использует представление из другого модуля (назовем его модулем «Потребление»), предоставлял сервис другому модулю, создающему представление (мы будем вызывать это модуль производства), чтобы модуль потребления мог получить фабрику для этих представлений. Надеюсь, пример прояснит это.

//What the Consuming module will expose via the Container
public interface IPersonCardProviderRegistrationService
{
     void RegisterProvider(IPersonCardProvider provider);
}

//What the Producing module will implement and pass to the Consuming module via the above interface
public interface IPersonCardProvider
{
     //If you need some interactivity, this could be an interface,
     //but if it's readonly data and little to no activity, object
     //is a perfectly valid type here
     object GetPersonCardView(long personID);
}

Таким образом, модуль «Потребители» может использовать провайдера для просмотра каждого человека, которого вы хотите показать. Модуль производства просто передает провайдера в модуль потребления через вызов RegisterProvider. В этом сценарии модуль производства будет иметь ModuleDependency к модулю потребления , но ссылка только на сборку необходима для третьей сборки с этими двумя интерфейсами (мы называем это Сборка "контрактов", но это не стандартный термин или что-то в этом роде.

...