代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

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

  •  8
  • Edward Tanguay  · 技术社区  · 16 年前

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

    在引导程序中,加载了两个模块,每个模块向每个选项卡项中注入一个视图:

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

    现在,当然,我想执行我一直在阅读和取消注释其中一个模块的去耦魔力,并看到它的选项卡项根本没有出现。相反,还有两个tabitems,一个是空的。这告诉我,我的应用程序仍然像以前糟糕的WinForm时代那样紧密地耦合数据和UI。

    那么,我需要在这里做什么来使这个动态的,这样用户界面就可以根据加载的模块进行动态的更改,也就是说,我可以在引导程序中加载10个模块/视图,并且TabControl中会自动有10个TabItem?

    中间答案:

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

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

    然后将两个控件加载到主区域:

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

    然后我得到一个带有两个选项卡的TabControl,每个选项卡中都有一个视图,这就是我想要的。

    但是没有定义tabItem头。如何动态定义头(例如,不是在XAML中,而是动态地在视图类中)?

    3 回复  |  直到 15 年前
        1
  •  10
  •   Carlo    16 年前

    这也是可行的:

    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}" />
    
        2
  •  7
  •   Pete Maher    16 年前

    很好。

    可以删除视图上的ViwewName属性,并将TabItem值上的绑定更改为value=“binding dataContext.headerInfo”。其中HeaderInfo是DataContext对象的属性,即选项卡项表示的业务对象。这个稍微优雅一点。

        3
  •  0
  •   Denis Troller    16 年前

    你的修改是正确的。

    我通常实现报头的方法是将对象添加到区域而不是控件中,然后用控件对其进行数据模板化。

    此对象定义一个属性(比如MyHeaderProperty),然后我使用TabControl上的ItemContainerStyle将其绑定到该属性。

    我不知道是否有一种方法可以在不使用这种技巧(中间对象和数据模板)的情况下实现这一点。

    推荐文章