Régions dynamiques Prism WPF

Sep 29 2020

Disons que nous avons une application Prism 7 avec les modules A et B. La fenêtre principale a un Tab Control et deux boutons, qui ajoutent le module A ou B au Tab Control. J'ai créé une liaison pour les éléments de contrôle des onglets et implémenté un modèle d'élément, qui inclut la région Prism, dont le nom est lié au nom de l'élément.

<TabControl ItemsSource="{Binding Tabs}">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}"/>
            </DataTemplate>
        </TabControl.ItemTemplate>
            
        <TabControl.ContentTemplate>
            <DataTemplate>
                <ContentControl prism:RegionManager.RegionName="{Binding}" />
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>

Le problème auquel je suis confronté est que le nom de la région ne semble pas changer, c'est-à-dire que si j'ajoute d'abord le module A, tous les prochains clics sur le bouton ajouteront le module A et vice versa. Dans ma question précédente Prism WPF Binding RegionManager.RegionName, on m'a expliqué que je ne devrais pas lier le RegionManger.RegionName, donc ma question est, comment dois-je implémenter les exigences?

Lien vers le repo: https://github.com/moisejbraver/ModulesTest

Réponses

1 AthulRaj Sep 29 2020 at 08:13

C'est ainsi que je gère les contrôles d'onglet avec les régions de prisme, je pense que cela vous est également utile.

<TabControl prism:RegionManager.RegionName="{x:Static local:RegionNames.AdvancedSetup}">
    <TabControl.ItemContainerStyle>
        <Style TargetType="TabItem">
            <Setter Property="Visibility" Value="{Binding DataContext.IsAvailable, Converter={coverters:BooleanToVisibilityConverter}}"/>
            <Setter Property="Header" Value="{Binding DataContext.Name}"/>
        </Style>
    </TabControl.ItemContainerStyle>
</TabControl>

Ensuite, j'enregistre tous mes onglets dans la même région dans la fonction OnInitialized de chaque module.

regionManager.RegisterViewWithRegion(RegionNames.AdvancedSetup, setupType);

J'ai créé une interface que tous les viewmodels des onglets implémenteront, elle contient

  1. Nom de l'onglet
  2. Si l'onglet est visible.

Vous devrez peut-être modifier certains détails en fonction de vos besoins.