PrismWPF動的領域

Sep 29 2020

モジュールAとBを備えたPrism7アプリケーションがあるとします。メインウィンドウには、タブコントロールと2つのボタンがあり、モジュールAまたはBのいずれかをタブコントロールに追加します。タブコントロールアイテムのバインディングを作成し、名前がアイテム名にバインドされているPrismRegionを含むアイテムテンプレートを実装しました。

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

私が直面している問題は、リージョン名が変更されていないように見えることです。つまり、最初にモジュールAを追加すると、次にボタンをクリックするたびにモジュールAが追加され、その逆も同様です。以前の質問で、Prism WPF Binding RegionManager.RegionNameをバインドするべきではないと説明されたRegionManger.RegionNameので、私の質問は、要件をどのように実装する必要があるかということです。

リポジトリへのリンク: https://github.com/moisejbraver/ModulesTest

回答

1 AthulRaj Sep 29 2020 at 08:13

これは私がプリズム領域でタブコントロールを処理する方法です、これはあなたにも役立つと思います。

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

次に、各モジュールのOnInitialized関数で、すべてのタブを同じ領域に登録します。

regionManager.RegisterViewWithRegion(RegionNames.AdvancedSetup, setupType);

タブのすべてのビューモデルが実装するインターフェースを作成しました。

  1. タブの名前
  2. タブが表示されているかどうか。

必要に応じて、詳細を変更する必要がある場合があります。