2010-03-24 8 views
0

Nous avons une balise Region dans la fenêtre de notre shell, en ajoutant des éléments à cette fenêtre.wpf prism (CAL) - Fenêtre de fermeture dans une fenêtre contextuelle lorsque le ViewModel ne sait rien de la vue

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

Nous ajoutons ViewModels au gestionnaire de la région et la vue est lié par un contexte de données afin que le ViewModel ne sait rien sur la vue par exemple

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

Ma question est de savoir comment puis-je fermer la Fenêtre pop-up, j'ai essayé de supprimer le ViewModel du RegionManager - mais cette exception ... la vue est un UserControl, mais j'ai besoin de fermer son propriétaire qui est une nouvelle fenêtre ouverte par la région. Je ne veux pas vraiment devoir le pirater via le DataContext du ViewModel.

Quelqu'un peut-il vous aider s'il vous plaît?

+0

Avez-vous un RegionAdapter pour une fenêtre? Une fenêtre est un ContentControl (donc ça devrait marcher), mais je n'ai jamais entendu parler de quelqu'un qui le ferait et je ne m'attendais vraiment pas à ce qu'il apparaisse des fenêtres quand quelque chose a été ajouté à la région. Pouvez-vous partager l'exception? –

Répondre

3

Andy,

Il m'a fallu un certain temps pour comprendre cela moi-même.

Le moyen le plus propre d'accomplir ceci est d'utiliser DelegateCommand (ou RelayCommand) et d'ajouter un gestionnaire d'événement dans le code qui crée la fenêtre avec window.Show().

// Define the View 
Shell window = Container.Resolve<Shell>(); 

// Define the ViewModel 
ShellViewModel windowVM = Container.Resolve<ShellViewModel>(); 

// When the ViewModel asks to be closed, close the View. 
EventHandler handler = null; 
handler = (sender, e) => 
{ 
    windowVM.RequestClose -= handler; 
    window.Close(); 
}; 
windowVM.RequestClose += handler; 

// Set the ViewModel as the DataContext of the View 
window.DataContext = windowVM; 

// Display the View 
window.Show(); 

J'utilise ensuite un événement composite pour notifier ViewModel (non UserControl de) de la fenêtre qu'il a une demande de fermeture. Le gestionnaire d'abonnement affecté à l'événement composite appelle ensuite this.OnRequestClose().

Dans le constructeur pour le ViewModel:

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

Dans le corps du ViewModel:

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

Voir Josh excellent article de Smith sur MSDN sur l'utilisation du modèle MV-VM avec WPF à http://msdn.microsoft.com/en-us/magazine/dd419663.aspx pour plus d'informations.

+0

et merci pour votre réponse. Dans mon scénario, j'utilise la navigation basée sur la vue, où les vues sont ajoutées à une région. Mon but est de fermer la vue (c'est-à-dire la retirer de la région) du ViewModel, sans enfermer le type ou le nom de la vue dans le modèle. quel est le moyen efficace de le faire? – Shimmy

0

_regionManager.Regions [RegionNames.PopupRegion] .Deactivate (_regionManager.Regions [RegionNames.PopupRegion] .ActiveViews.FirstOrDefault());