我正在使用Prism 5在WPF中开发复合应用程序。
用户需要输入他的登录名和密码,应用程序加载模块动态地与用户帐户类型相关。 (root,admin,简单用户) 每个加载的模块都有一个类别,例如: 行政类别: - 用户 - 申请首选项 - ......我希望在我的窗口左侧的ListBox上获取所有类别,当我的Categories ListBox上的Selection更改时,然后在右侧显示带有指定项目的相关TabControl(已加载的模块)
如下:
我的类别和模块类被定义为以下内容:
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; }
和
在每个模块中,我将主视图关联到与我的类别同名的区域。
RegionManager.RequestNavigate("CategoryName", "ModuleMainView");
如何在itemscontrol datatemplate中添加区域名称并将其与TabControl相关联? 我尝试执行以下操作直接绑定categoryName:
<TabControl prism.RegionManager.RegionName="{Binding Name}"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
这允许Prism直接在TabControl的新项中添加已加载模型的视图。但经过几个小时的谷歌搜索,我发现this post Damian解释说该地区已经创建但从未注册过!我也尝试使用他的代码,但他的解决方案不适用于棱镜5, 有什么建议吗?
答案 0 :(得分:1)
您可以在以下 Codeplex 主题中找到相同问题的答案:
您可以在 Damian Cherubini 制作的 WPF 示例解决方案下方找到,更新为 Prism 5 。 Damian的方法可以在this blogpost找到,而 Prism 5 的更新只是通过引用相应的程序集来实现的:
此外,关于 Damian的您提到的其他方法,在将 Silverlight 示例迁移到<后,可以对 Prism 5 进行类似的更新strong> WPF ,因为 Silverlight 尚不支持。
问候。