Динамическое создание элементов панели инструментов и панели инструментов с использованием MVVM
Проект составлен с использованием WPF MVVMLight Framework.
Цель состоит в том, чтобы: создать набор панелей инструментов, при этом каждая панель инструментов также имеет элементы панели инструментов (кнопки для ясности), созданные динамически, используя только необходимый "каркасный" код в XAML.
Попытка динамически создавать меню была успешной благодаря использованию HierarchicalDataTemplate для распространения элементов Menu для него.
С Меню это просто создавало каждый объект Меню с массивом MenuItems внутри него.
Проблема с панелями инструментов; однако, это то, что должен быть массив ToolBars с другим массивом Items внутри него...
public enum SiClopsExplorerToolbarType
{
#region file
[Description( "New Folder" )]
[TypeId( 1 )]
Folder ,
[Description( "New File" )]
[TypeId( 1 )]
File ,
.
.
#endregion // file
#region edit
[Description( "Cut" )]
[TypeId( 2 )]
Cut ,
[Description( "Copy" )]
[TypeId( 2 )]
Copy ,
[Description( "Paste" )]
[TypeId( 2 )]
Paste ,
#endregion // edit
#region view
[Description( "SI-CLOPS Explorer" )]
[TypeId( 3 )]
SiClopsExplorer ,
[Description( "Publication Data" )]
[TypeId( 3 )]
PublicationData ,
#endregion // view
}
... TypeId для каждого перечисления указывает, для какой панели инструментов создать и, таким образом, создать кнопки для: TB 1 (файл), TB 2 (редактирование), TB 3 (просмотр) для трех панелей инструментов и их кнопок.
public class ToolbarEntity
{
#region constructor
#endregion // constructor
public ToolbarEntity()
{
Toolbars = new List<ToolbarEntity>();
}
#region properties
public IList<ToolbarEntity> Toolbars { get; set; }
/// <summary>
/// The Description value of the MDI child-menu-type enumerated object is used as the display value for each menu item.
/// </summary>
public string Text { get; set; }
/// <summary>
/// An integer denoting the menu-level. Top level menus are zero. 1st sub-level menus are one, etc.
/// </summary>
public int MenuLevel { get; set; }
/// <summary>
/// Top Level menus are given a unique id so can delineate the start of the next top-level menu.
/// </summary>
public int MenuId { get; set; }
#endregion // properties
}
Выше приведен простой класс, который будет использоваться в качестве модели MVVM, в которой будет выполняться привязка данных для представления.
Для самого View желательно что-то вроде следующего:
<ToolBarTray DockPanel.Dock="Top">
<!-- Dynamically created or hardcoded in XAML... -->
<ToolBar >
<!-- Dynamically created ToolBar items... -->
<Button />
</ToolBar>
<!-- Dynamically created or hardcoded in XAML... -->
<ToolBar >
<!-- Dynamically created ToolBar items... -->
<Button />
</ToolBar>
</ToolBarTray>
Как панели инструментов и связанные с ними элементы панели инструментов будут созданы ViewModel?
заранее спасибо
1 ответ
Закончилось только использованием XAML для панелей инструментов в качестве заполнителей, а затем с использованием кода для всех элементов.