8

在 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 个模块/视图,并且 TabControl 中会自动有 10 个 TabItems?

中间答案:

如果我只在 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 类中动态定义)?

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

好的。

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

于 2009-05-15T13:39:13.400 回答
0

您的修改走在了正确的轨道上。

我通常实现标题的方式是向区域添加一个对象而不是控件,并使用控件对其进行数据模板化。

该对象定义了一个属性(假设是 MyHeaderProperty),然后我使用 TabControl 上的 ItemContainerStyle 将其绑定到。

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

于 2009-03-13T15:46:56.927 回答