В Composite WPF (Prism) в чем разница между IRegion.Add и IRegionManager.RegisterViewWithRegion?

Какая разница между использованием IRegion.Add и IRegionManager.RegisterViewWithRegion?

IRegion.Добавить

public void Initialize()
{
    _regionManager.Regions["MainRegion"].Add( new ModuleAView() );
}

IRegionManager.RegisterViewWithRegion

public void Initialize()
{
    _regionManager.RegisterViewWithRegion( "MainRegion", typeof( ModuleAView ) );
}

person Metro Smurf    schedule 14.09.2009    source источник


Ответы (2)


Разница в том, кто отвечает за создание представления. В сценарии IRegion.Add (также называемом Внедрение представления) вы несете ответственность за предварительное создание экземпляра представления. В другом сценарии с RegisterViewWithRegion (также называемом Обнаружение представлений) диспетчер регионов создает экземпляр самого представления.

Есть некоторые технические причины, по которым вы хотели бы сделать то или иное. Например

  • у вас был более сложный способ создания представлений (возможно, вы хотите создать представление и его ViewModel и объединить их, установив свойство DataContext самостоятельно), вам нужно будет использовать View Injection
  • если вы воспользуетесь преимуществами Region Scopes, вам придется использовать View Injection.

Соответствующая документация: Для композиции представлений (включая View Injection и View Discovery и обсуждение подходов View-First или View-Presenter-First): http://msdn.microsoft.com/en-us/библиотека/dd458944.aspx

Также есть очень удобный раздел «когда использовать каждый». Вот выдержка из документов:

  • Явный или программный контроль над тем, когда представление создается и отображается, или когда вам нужно удалить представление из региона, например, в результате логики приложения.
  • Для отображения нескольких экземпляров одних и тех же представлений в регионе, где каждый экземпляр представления привязан к разным данным.
  • Чтобы контролировать, какой экземпляр региона добавляет представление (например, если вы хотите добавить представление сведений о клиенте в конкретный регион сведений о клиенте). Обратите внимание, что для этого сценария требуются регионы с заданной областью действия, описанные далее в этом разделе.

Надеюсь это поможет.

person Anderson Imes    schedule 14.09.2009
comment
@Андерсон - твой ответ действительно помогает. Насколько я понимаю, IRegion.Add и IRegionManager.RegisterViewWithRegion создают конкретный экземпляр представления и сразу же добавляют его в IRegionCollection. По общему признанию, я только что закрепился на CAG. Не могли бы вы указать мне пример с более подробной информацией? Я просмотрел QuickStarts и HowTos, но я не совсем понимаю, когда делать то или другое, потому что образцы используют их в методе Imodule.Initialize, и ни один из них не делает ничего другого в примерах. - person Metro Smurf; 14.09.2009
comment
Нет, разница в том, что с Add вы передаете уже созданное представление. С помощью RegisterViewWithRegion вы передаете либо тип, либо делегат, либо объект (экземпляр представления). В большинстве случаев последняя перегрузка не используется. Дайте мне секунду, и я укажу вам нужное место в Документах. - person Anderson Imes; 14.09.2009
comment
Обновлен со ссылкой на лучший ресурс в документации, и я вытащил официальную формулировку того, когда использовать инъекцию представления или обнаружение представления. Надеюсь, это понятнее моего описания. - person Anderson Imes; 14.09.2009
comment
@Anderson - Сегодня днем ​​я потрачу некоторое время на перечитывание документации по композиции пользовательского интерфейса. fwiw: мое предположение о том, что оба метода создают конкретный экземпляр представления непосредственно в IRegionCollection, было основано на пошаговом выполнении отладчика и ближе к концу цикла RegisterViewWithRegion, конкретный экземпляр представления был создан и добавлен в коллекцию. Большое спасибо за Вашу помощь! - person Metro Smurf; 14.09.2009
comment
Это всегда будет происходить, конечно. Просто какой код отвечает за создание экземпляра... ваш или их :) - person Anderson Imes; 14.09.2009

RegisterViewWithRegion вызывает событие OnContentRegistered, но, конечно, это может быть не так, в зависимости от вашего DI.

person slf    schedule 14.09.2009
comment
когда вы напрямую изменяете свойство с помощью оператора скобок, вы не собираетесь вызывать событие, но когда вы вызываете другой метод, вы получаете как измененную коллекцию, так и событие, которое может уведомить любого, кто его слушает - person slf; 15.09.2009