2015-10-26 2 views
1

Я рассмотрел часть официального примера InteractivityQuickstart.Prism5 PopupWindowАкции и инъекции

<prism:InteractionRequestTrigger SourceObject="{Binding ItemSelectionRequest, Mode=OneWay}"> 
     <prism:PopupWindowAction> 
      <prism:PopupWindowAction.WindowContent> 
       <views:ItemSelectionView /> 
      </prism:PopupWindowAction.WindowContent> 
     </prism:PopupWindowAction> 
    </prism:InteractionRequestTrigger> 

Так, ItemSelectionRequest называют менее параметром конструктора

public ItemSelectionView() 
{ 
    this.DataContext = new ItemSelectionViewModel(); 
    InitializeComponent(); 
} 

в коде-позади ItemSelectionView.

Вопросы: 1) Как можно установить DataContext без "новый", потому что

public ItemSelectionView(ItemSelectionViewModel model) 

или

[Dependency] 
public ItemSelectionViewModel ViewModel 
{ 
    set { this.DataContext = value; } 
} 

Безразлично `работы. мне нужно, чтобы получить некоторые услуги в ViewModel => мне нужно позвонить что-то вроде этого

public ItemSelectionViewModel(IEventAggregator eventAggregator) 
{ 
    _eventAggregator=eventAggregator; 
} 

ответ

2

Если вам нужна услуга для вашего Всплывающего ViewModel, вы можете получить его с помощью поиска сервиса.

public ItemSelectionView() 
{ 
    InitializeComponent(); 
    DataContext = ServiceLocator.Current.GetInstance<ItemSelectionViewModel>(); 
} 
+0

Удивительный! Но у меня возникла небольшая проблема: это всплывающее окно должно появиться после момента загрузки оболочки, что-то вроде формы входа, поэтому поднимите его на событие «Loaded» на shell (= после CreateShell() в BootStrapper). С услугами призмы все в порядке, но проблема связана с общими службами, потому что модули загружаются после CreateShell(), и я получаю исключение. Какая хорошая платица, как повысить всплывающее окно после загрузки оболочки? – galakt

+0

Пожалуйста, отметьте это как ответ для этой конкретной проблемы, а затем задайте другой вопрос как отдельный пост. Благодарю. –

0

Вместо того чтобы использовать это ServiceLocator, чтобы установить ViewModel, как говорит Брайан Lagunas, почему бы не иметь конструктор без параметров для ViewModel, установите ViewModel непосредственно в View классе (XAML или код-сзади), а также использовать это ServiceLocator внутри самой модели ViewModel для получения услуг (или их интерфейсов), которые требуется вашему ViewModel? Я полагаю, это по двум причинам:

  • Использование в поиске сервиса конструктору View для всплывающего окна даст вам ошибку «ServiceLocationProvider должен быть установлен» во время разработки в «Призма: PopupWindowAction.WindowContent» раздел , (Хотя он отлично работает во время выполнения.)
  • Вы уже были вынуждены в ситуации, когда вам нужно каким-то образом обойти инъекцию зависимостей, поэтому почему бы не упростить код, особенно если вам нужен только один доступ к одной службе.

Так что вы можете сделать что-то вроде этого:

public ItemSelectionViewModel() 
{ 
    _eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>(); 
} 

И если вам нужно только использовать объект IEventAggregator один раз, нет никаких оснований даже назначить его на поле. Просто используйте вызов ServiceLocator, где вам нужно получить агрегатор событий и полностью удалить свой явный конструктор.

+0

Я ушел от PopupWindowAction) – galakt

Смежные вопросы