【问题标题】:In Prism (Composite Application Guidelines), how can I get views dynamically loaded into TabControl?在 Prism(复合应用程序指南)中,如何将视图动态加载到 TabControl 中?
【发布时间】:2009-03-09 12:17:03
【问题描述】:

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

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

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

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

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

中间答案:

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

<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));
        }

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

但未定义 TabItem 标头。如何动态定义标头(例如,不在 XAML 中,而是在 View 类中动态定义)?

【问题讨论】:

    标签: prism composite-application-gu


    【解决方案1】:

    这也有效:

    public class View : UserControl
    {
    
        public string ViewName { get; set; }
    
    }
    

    然后在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}" />
    

    【讨论】:

    • 更传统的 MVVM 方法会将 ViewName 属性移动到 ViewModel,然后绑定将更改为:Value="{Binding Path=DataContext.ViewName}"
    【解决方案2】:

    不错。

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

    【讨论】:

      【解决方案3】:

      你的修改是正确的。

      我通常实现页眉的方法是向区域添加一个对象而不是控件,然后用控件对其进行数据模板化。

      这个对象定义了一个属性(比如 MyHeaderProperty),然后我用它来绑定到 TabControl 上的 ItemContainerStyle。

      我不知道是否有办法在不使用那种技巧(中间对象和 DataTemplate)的情况下实现这一目标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-20
        • 1970-01-01
        相关资源
        最近更新 更多