2017-10-18 10 views
1

Dans mon application PRISM, l'utilisateur peut ouvrir une vue d'un module dans un onglet (Navigate("TestView")). Maintenant, je veux fermer cette vue via OnCloseTab("TestView") mais la vue enregistrée n'a pas de nom.Est-il possible d'enregistrer View avec son nom via regionManager.RequestNavigate pour l'enlever plus tard de la région?

public class MainWindowViewModel: BindableBase 
{ 
... 
    private void Navigate(string uri) 
    { 
     this.regionManager.RequestNavigate("TabRegion", uri);    
    } 

    private void OnCloseTab(string uri) 
    { 
     IRegion region = this.regionManager.Regions["TabRegion"]; 

     object view = region.GetView(uri); 
     if (view != null) 
     { 
      region.Remove(view); 
     } 

    } 
} 

Le module est enregistré dans mon bootstrapper comme ceci:

protected override void ConfigureModuleCatalog() 
{ 
    base.ConfigureModuleCatalog(); 

    ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog; 
    Type modulePType = typeof(Module.ProductionData.ProductionDataModule);       
    moduleCatalog.AddModule(typeof(Module.ProductionData.ProductionDataModule));    
} 

Il fonctionne avec:

IRegion region = regionManager.Regions["TabRegion"]; 

object view = region.GetView("TestView"); 
if (view == null) 
{ 
    view = ServiceLocator.Current.GetInstance<Views.TestView>(); 
    region.Add(view, "TestView"); 
} 

Mais le MainWindowViewModel ne sait pas sur les vues des modules. Y at-il un moyen de supprimer la vue, quand il n'a pas de nom? Merci pour tout conseil

Répondre

0

Merci Luc. J'ai trouvé une solution pour mon problème here

Dans mon MainWindowView.cs (XAML) J'ai ajouté ce qui suit:

<TabControl.ItemTemplate> 
    <DataTemplate> 
     <DockPanel Width="Auto"> 
      <Button Command="{Binding DataContext.CloseTabCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" 
    CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" 
    Content="X" 
    Cursor="Hand" 
    DockPanel.Dock="Right" 
    Focusable="False" 
    FontFamily="Courier" 
    FontWeight="Bold" 
    Margin="4,0,0,0" 
    FontSize="10" 
    VerticalContentAlignment="Center" 
    Width="15" Height="15" /> 

      <ContentPresenter Content="{Binding DataContext.DataContext.ViewTitle, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" /> 
     </DockPanel> 
    </DataTemplate> 
</TabControl.ItemTemplate> 

Dans mon MainWindowViewModel.cs j'ai changé CloseCommand comme ceci:

public DelegateCommand<object> CloseTabCommand { get; set; } 

public MainWindowViewModel(IRegionManager regionManager) 
{ 
    this.regionManager = regionManager; 

    CloseTabCommand = new DelegateCommand<object>(OnCloseTab); 

} 
private void OnCloseTab(object tabItem) 
{ 
    var view = ((System.Windows.Controls.TabItem)tabItem).DataContext; 
    this.regionManager.Regions["TabRegion"].Remove(view); 
} 
1

La méthode RequestNavigate("TabRegion", uri) interne ajoute la vue sélectionnée dans la région en utilisant la méthode suivante:

IRegionManager Add(object view, string viewName, bool createRegionManagerScope) 

appelé avec les paramètres suivants:

RegionManager.Add(view, null, false); 

donc pas le nom est associé à la vue naviguée. Par conséquent, il n'est pas possible de récupérer l'objet de vue en utilisant le nom de vue/uri. Une autre approche est d'essayer de correspondre au type de .net de la vue:

object view = region.Views.FirstOrDefault(v => v.GetType() == typeof(yourViewType)); 

Si cela ne suffit pas vous pouvez toujours ajouter des propriétés supplémentaires sur votre objet de vue et essayer de les récupérer jeter les vues dans un type approprié .

+0

Merci pour votre aide, Luke. J'ai posté ma solution finale. – Max