wpf prism (CAL) - Закрытие окна в области всплывающих окон, когда ViewModel ничего не знает о представлении - PullRequest
0 голосов
/ 24 марта 2010

У нас есть тег Region в Window нашей оболочки, при добавлении элементов в этот регион появляется другое окно.

<Window x:Class="GTS.GRS.N3.Shell.Shell1"
 --removed namespace references for clarity
    cal:RegionManager.RegionName="{x:Static Constants:RegionNames.WindowRegion}">  

Мы добавляем ViewModel в Region Manager, а затем View присоединяется через контекст данных, так что ViewModel ничего не знает о View, т. Е.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <DataTemplate DataType="{x:Type Model:CommunicationViewModel}">
       <v:CommunicationView />
    </DataTemplate>
</ResourceDictionary>

У меня вопрос: как закрыть всплывающее окно, я пытался удалить ViewModel из RegionManager - но это исключения ... View - это UserControl, но мне нужно закрыть его Owner, который является новым окном, открытым область. Я действительно не хочу взламывать его через DataContext из ViewModel.

Может кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

3 голосов
/ 05 мая 2010

Энди,

Мне потребовалось довольно много времени, чтобы понять это сам.

Самый простой способ сделать это - использовать DelegateCommand (или RelayCommand) и добавить обработчик событий в код, который создает окно с окном.затем используйте Composite Event, чтобы уведомить ViewModel окна (а не UserControl), что у него есть запрос на закрытие.Затем назначенный обработчик подписки для составного события вызывает this.OnRequestClose().

В конструкторе для модели представления:

//subscribe to composite events
_eventAggregator.GetEvent<WindowCloseEvent>().Subscribe(WindowClose);

В теле модели представления:

/// <summary>
/// Private Event handler for WindowCloseEvent.
/// </summary>
private void WindowClose(bool value)
{
    // Close the View
    this.OnRequestClose();
}

См. Отличную статью Джоша Смита на MSDN об использовании шаблона MV-VM с WPF по адресу http://msdn.microsoft.com/en-us/magazine/dd419663.aspx для получения дополнительной информации.

0 голосов
/ 09 октября 2014

_regionManager.Regions [RegionNames.PopupRegion] .Deactivate (_regionManager.Regions [RegionNames.PopupRegion] .ActiveViews.FirstOrDefault ()); * * тысяча один

...