在Prism(复合应用程序指南)中,如何将视图动态加载到TabControl中?

Edw*_*uay 8 prism composite-application-gu

在Prism v2应用程序中,我定义了两个区域,每个区域都是tabcontrol中的一个tabitem:

<UniformGrid Margin="10">
    <TabControl>
        <TabItem Header="First" Name="MainRegion" cal:RegionManager.RegionName="MainRegion"/>
        <TabItem Header="Second" Name="SecondRegion" cal:RegionManager.RegionName="SecondRegion"/>
    </TabControl>
</UniformGrid>
Run Code Online (Sandbox Code Playgroud)

在引导程序中加载了两个模块,每个模块都为每个tabitems注入一个视图:

protected override IModuleCatalog GetModuleCatalog()
{
    ModuleCatalog catalog = new ModuleCatalog();
    catalog.AddModule(typeof(SecondModule.SecondModule));
    catalog.AddModule(typeof(HelloWorldModule.HelloWorldModule));
    return catalog;
}
Run Code Online (Sandbox Code Playgroud)

现在,当然,我想要执行我一直阅读的解耦魔法并取消注释其中一个模块,并看到它的标签项根本不显示.相反,相反,仍然有两个TabItem,一个是空的.这告诉我,我的应用程序仍然紧密地耦合数据和UI,就像旧的WinForm时代那样.

那么我需要做些什么来使这个动态化,以便UI根据加载的模块动态变化,即我可以在我的引导程序中加载10个模块/视图,TabControl中会自动出现10个TabItems?

中级答案:

如果我只是在TabControl中创建一个区域:

<TabControl Name="MainRegion" cal:RegionManager.RegionName="MainRegion"/>
Run Code Online (Sandbox Code Playgroud)

然后将两个控件加载到MainRegion中:

        public void Initialize()
        {
            regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.SecondView));
        }
...
        public void Initialize()
        {
            regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.HelloWorldView));
        }
Run Code Online (Sandbox Code Playgroud)

然后我得到一个带有两个标签的TabControl,每个标签都有一个视图,这就是我想要的.

但是没有定义TabItem标头.如何动态定义标头(例如,不是在XAML中,而是在View类中动态地返回)?

小智 10

这也有效:

public class View : UserControl
{

    public string ViewName { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

然后在shell中:

<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}" />
Run Code Online (Sandbox Code Playgroud)


小智 7

尼斯.

您可以删除视图上的ViwewName属性,并将TabItem值的绑定更改为Value ="{Binding DataContext.HeaderInfo}"...其中HeaderInfo是DataContext对象的属性 - IE是Tab项的业务对象代表.这更优雅一点.