8

Prism v2 アプリケーションでは、2 つの領域を定義し、それぞれがタブ コントロール内のタブ項目です。

<UniformGrid Margin="10">
    <TabControl>
        <TabItem Header="First" Name="MainRegion" cal:RegionManager.RegionName="MainRegion"/>
        <TabItem Header="Second" Name="SecondRegion" cal:RegionManager.RegionName="SecondRegion"/>
    </TabControl>
</UniformGrid>

ブートストラップでは、2 つのモジュールがロードされ、それぞれが各タブ項目にビューを挿入します。

protected override IModuleCatalog GetModuleCatalog()
{
    ModuleCatalog catalog = new ModuleCatalog();
    catalog.AddModule(typeof(SecondModule.SecondModule));
    catalog.AddModule(typeof(HelloWorldModule.HelloWorldModule));
    return catalog;
}

もちろん、私が読み続けているデカップリング マジックを実行し、モジュールの 1 つのコメントを外して、そのタブ項目がまったく表示されないようにしたいと考えています。代わりに、TabItems が 2 つあり、1 つが空です。これは、古い WinForm 時代のように、私のアプリケーションがまだデータと UI を緊密に結合していることを示しています。

では、これを動的にするためにここで何をする必要がありますか?つまり、読み込まれるモジュールに基づいて UI が動的に変化するようにします。つまり、ブートストラップに 10 個のモジュール/ビューを読み込むことができ、TabControl に自動的に 10 個の TabItem が存在するようにしますか?

中間の答え:

TabControl でリージョンを 1 つだけ作成すると、次のようになります。

<TabControl Name="MainRegion" cal:RegionManager.RegionName="MainRegion"/>

次に、両方のコントロールを MainRegion にロードします。

        public void Initialize()
        {
            regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.SecondView));
        }
...
        public void Initialize()
        {
            regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.HelloWorldView));
        }

次に、2 つのタブを持つ TabControl を取得します。それぞれにビューがあり、これが必要です。

ただし、TabItem ヘッダーは定義されていません。ヘッダーを動的に定義するにはどうすればよいですか (たとえば、XAML ではなく、View クラスで動的に戻します)。

4

3 に答える 3

10

これも機能します:

public class View : UserControl
{

    public string ViewName { get; set; }

}

そしてシェルで:

<Window.Resources>        
       <Style TargetType="{x:Type TabItem}" x:Key="TabItemRegionStyle">
                <Setter Property="Header" Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.ViewName}" />
       </Style>
</Window.Resources>
    ...
<TabControl cal:RegionManager.RegionName="RightRegion" Width="Auto" Height="Auto" HorizontalAlignment="Stretch" Grid.Column="2" 
                x:Name="RightRegion" ItemContainerStyle="{StaticResource TabItemRegionStyle}" />
于 2009-04-24T00:36:33.517 に答える
7

良い。

ビューの ViewName プロパティを削除し、TabItem 値のバインディングを Value="{Binding DataContext.HeaderInfo}" に変更できます ... ここで、HeaderInfo は DataContext オブジェクトのプロパティです。を表します。これはもう少しエレガントです。

于 2009-05-15T13:39:13.400 に答える