Prism 5模块化:如何在ItemsControl中的TabControl的DataTemplate中添加RegionName

时间:2014-05-06 20:16:37

标签: c# wpf mvvm prism mef

我正在使用Prism 5在WPF中开发复合应用程序。

用户需要输入他的登录名和密码,应用程序加载模块动态地与用户帐户类型相关。 (root,admin,简单用户) 每个加载的模块都有一个类别,例如: 行政类别:    - 用户    - 申请首选项    - ......

我希望在我的窗口左侧的ListBox上获取所有类别,当我的Categories ListBox上的Selection更改时,然后在右侧显示带有指定项目的相关TabControl(已加载的模块)

如下: Schema

我的类别和模块类被定义为以下内容:

public class Category
{
    private readonly ObservableCollection<Module> modules = new ObservableCollection<Module>();
    /// <summary>
    /// The category name
    /// </summary>
    public string Name { get; set; }
    /// <summary>
    /// Modules List
    /// </summary>
    public ObservableCollection<Module> Modules
    {
        get { return modules; }
    }
}

public class Module
{
    /// <summary>
    /// The module name
    /// </summary>
    public string Name { get; set; }
    /// <summary>
    /// The module header on the tabControl
    /// </summary>
    public string Header { get; set; }
}

查看:

<Grid.RowDefinitions>
        <RowDefinition Height="50" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="160" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Button Width="120" Height="40" Content="Initialize" Command="{Binding InitializeCategoriesCommand}" />
    <ListBox x:Name="CategoriesListBox" Grid.Row="1" Grid.Column="0" 
             ItemsSource="{Binding Categories}" SelectedIndex="{Binding SelectedIndex}" SelectionChanged="Selector_OnSelectionChanged">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" TextAlignment="Center" FontSize="30" VerticalAlignment="Center"
                           TextWrapping="Wrap" Padding="10" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <ItemsControl x:Name="TabControlsItems" 
                  ItemsSource="{Binding Categories}"
                  Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                  >
        <ItemsControl.ItemContainerStyle>
            <Style TargetType="{x:Type ContentPresenter}">
                <Setter Property="Visibility" Value="Collapsed"/>
            </Style>
        </ItemsControl.ItemContainerStyle>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TabControl ItemsSource="{Binding Modules}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  >
                    <TabControl.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Header}" />
                        </DataTemplate>
                    </TabControl.ItemTemplate>
                    <TabControl.ContentTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock Text="Module Content" FontSize="30" />
                                <TextBlock Text="{Binding Name}" FontSize="20" />
                            </StackPanel>
                        </DataTemplate>
                    </TabControl.ContentTemplate>
                </TabControl>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

视图模型:

private readonly ObservableCollection<Category> categories = new ObservableCollection<Category>();
    private IModuleManager moduleManager;
    private IRegionManager regionManager;

    public MainViewModel(IRegionManager regionManager, IModuleManager moduleManager)
    {
        this.regionManager = regionManager;
        this.moduleManager = moduleManager;
        InitializeCategoriesCommand = new DelegateCommand(InitializeCategories);
    }

    private void InitializeCategories()
    {
        Categories.Clear();
        for (var i = 1; i < 5; i++)
        {
            var cat = new Category("Cat " + i);
            cat.InitializeModules();
            Categories.Add(cat);
        }
    }

    public ObservableCollection<Category> Categories
    {
        get { return categories; }
    }

    public DelegateCommand InitializeCategoriesCommand { get; private set; }

上面的代码给出了以下结果,它完美地运行:

Image

Image

模块:

在每个模块中,我将主视图关联到与我的类别同名的区域。

RegionManager.RequestNavigate("CategoryName", "ModuleMainView");

我的问题:

如何在itemscontrol datatemplate中添加区域名称并将其与TabControl相关联? 我尝试执行以下操作直接绑定categoryName:

<TabControl prism.RegionManager.RegionName="{Binding Name}" 
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  />

这允许Prism直接在TabControl的新项中添加已加载模型的视图。但经过几个小时的谷歌搜索,我发现this post Damian解释说该地区已经创建但从未注册过!我也尝试使用他的代码,但他的解决方案不适用于棱镜5, 有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您可以在以下 Codeplex 主题中找到相同问题的答案:

您可以在 Damian Cherubini 制作的 WPF 示例解决方案下方找到,更新为 Prism 5 。 Damian的方法可以在this blogpost找到,而 Prism 5 的更新只是通过引用相应的程序集来实现的:

此外,关于 Damian的您提到的其他方法,在将 Silverlight 示例迁移到<后,可以对 Prism 5 进行类似的更新strong> WPF ,因为 Silverlight 尚不支持。

问候。