Призма 5 модульность: как добавить RegionName в шаблон данных DataTemplate для управления TabControl в управления ItemsControl



Я работаю над составным приложением в WPF с использованием Prism 5.



Пользователь, должен ввести свой логин и пароль, чем, модули загрузки приложения динамически связаны с типом учетной записи пользователя. (root, admin, простой пользователь)
Каждый загруженный модуль имеет категорию, пример:
Категории Администрации :
- Пользователи
- Настройки Приложения
- ... ..



Я хочу получить все категории В списке в левой части моего окна, когда выбор изменился в моем списке категорий, а затем показать связанный элемент управления 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>


ViewModel:



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?
Я попытался сделать следующее, чтобы напрямую связать имя категории:



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


Это позволяет Prism добавлять представления из загруженных моделей непосредственно в новый элемент в TabControl. но после нескольких часов Гугла я нашел этот пост , где Дамиан объясняет, что регион создан, но никогда не регистрировался! я попытался также использовать его код, но его решение не работает на prism 5,
Какие-нибудь предложения, пожалуйста?

613   1  

1 ответ:

Вы можете найти ответ на тот же вопрос в следующем потокеCodeplex :

Вы можете найти ниже WPF пример решения, сделанного Дамиан Керубини, обновлено до Prism 5. Подход Дамиана можно найти в этом блоге , а обновление до Prism 5 было просто сделано путем ссылки на соответствующий сборки:

Кроме того, что касается Дамиана другого подхода, который вы упомянули, аналогичное обновление Prism 5 может быть сделано после миграции образца Silverlight в WPF, поскольку Silverlight пока не поддерживается.

С уважением.

Comments

    Ничего не найдено.