Prism WPF Dynamic Regions

Sep 29 2020

Supponiamo di avere un'applicazione Prism 7 con i moduli A e B. La finestra principale ha un controllo scheda e due pulsanti, che aggiungono il modulo A o B al controllo scheda. Ho creato un'associazione per gli elementi Controllo struttura a schede e implementato un modello di elemento, che include Prism Region, il cui nome è associato al nome dell'elemento.

<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>

Il problema che sto affrontando è che il nome della regione non sembra cambiare, cioè se aggiungo prima il Modulo A, tutti i successivi clic sui pulsanti aggiungeranno il Modulo A e viceversa. Nella mia domanda precedente Prism WPF Binding RegionManager.RegionName mi è stato spiegato che non dovrei associare RegionManger.RegionName, quindi la mia domanda è: come devo implementare i requisiti?

Collegamento al repo: https://github.com/moisejbraver/ModulesTest

Risposte

1 AthulRaj Sep 29 2020 at 08:13

Questo è il modo in cui gestisco i controlli a schede con le regioni prismatiche, penso che questo sia utile anche per te.

<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>

Quindi registro tutte le mie schede nella stessa regione nella funzione OnInitialized di ciascun modulo.

regionManager.RegisterViewWithRegion(RegionNames.AdvancedSetup, setupType);

Ho creato un'interfaccia che tutti i viewmodels delle schede implementeranno, contiene

  1. Nome della scheda
  2. Se la scheda è visibile.

Potrebbe essere necessario modificare alcuni dettagli in base alle proprie esigenze.