Есть TreeView (каталог разнотипных объектов) и TabControl, который будет в себе хранить формы.
<!-- Представление каталога -->
<GroupBox Header="Catalog">
<TreeView FontSize="14pt" ItemsSource="{Binding RootNodes}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type vm:NodeViewModel}"
ItemsSource="{Binding Subnodes}">
<StackPanel Orientation="Horizontal">
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem Header="Добавить" Command="{Binding AddChildCommand}" />
<MenuItem Header="Удалить" Command="{Binding RemoveChildCommand}" />
</ContextMenu>
</StackPanel.ContextMenu>
<TextBlock Text="{Binding Name}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type vm:EquipmentNodeViewModel}"
ItemsSource="{Binding Subnodes}">
<StackPanel Orientation="Horizontal">
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem Header="Добавить" Command="{Binding AddChildCommand}" />
<MenuItem Header="Удалить" Command="{Binding RemoveChildCommand}" />
<MenuItem Header="Тест" />
</ContextMenu>
</StackPanel.ContextMenu>
<TextBlock Text="{Binding Name}" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
<i:Interaction.Behaviors>
<service:BindableSelectedItemBehavior SelectedItem="{Binding Path=SelectedNode, Mode=TwoWay}"/>
</i:Interaction.Behaviors>
</TreeView>
</GroupBox>
<!-- Представление контейнера для форм -->
<TabControl Grid.Column="1" Grid.Row="0"
ItemsSource="{Binding Workspaces}">
<TabControl.Resources>
<DataTemplate DataType="{x:Type vm:Workspace1ViewModel}">
<v:Workspace1/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:Workspace2ViewModel}">
<v:Workspace2/>
</DataTemplate>
</TabControl.Resources>
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=HeaderText}"/>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
В данный момент я могу удалять/создавать записи через контекстное меню.
Команды поведения узлов определены в ViewModel NodeViewModel
#region AddChildCommand
public ICommand AddChildCommand { get; }
private bool CanAddChildCommandExecute(object param) => true;
private void OnAddChildCommandExecuted(object param)
{
try {
using (var context = new EFContext()) {
var node = new CLASSNODE_DEFINITIONS {
type = Type,
parent_id = _Node.id
};
node.name = $"new{node.type}1";
node.disp = $"New {node.type}";
context.CLASSNODE_DEFINITIONS.Add(node);
context.SaveChanges();
Subnodes.Add(new NodeViewModel(node, this));
}
} catch (Exception e) {
throw e;
}
}
#endregion
Но теперь мне надо сделать следующее: допустим, при добавлении как то нужно
- передать узел, который был добавлен, в конструктор Workspace (формы т.е. View будут заготовлены для каждого типа объекта в каталоге), но свойство коллекции Workspaces находится НЕ на
NodeViewModel, а наWinMainViewModel(как передать правильно не могу понять) - выбрать его в дереве каталога
- как лучше всего реализавать изменение свойств объекта? в плане передачи данных и сввязываний
Как вы поняли это просто обычный древовидный каталог, где узлами могут быть разные типы данных и иметь разное поведение.
А при нажатиях ИЛИ по контекстному меню можно вызывать ещё какие то заготовленные View в Workspaces и манипулировать с объектом.
Вот ещё код:
Допустим форма для оборудования
internal class Workspace1ViewModel : WorkspaceViewModelBase
{
public Workspace1ViewModel() => HeaderText = "1";
public string EquipmentField = "Equipment";
}
Это я делал разный тип ViewModel для разных функций в ContextMenu, пока всё работает
internal class EquipmentNodeViewModel : NodeViewModel
{
public EquipmentNodeViewModel(CLASSNODE_DEFINITIONS node, NodeViewModel parent) : base(node, parent)
{
}
}
это для опор
internal class Workspace2ViewModel : WorkspaceViewModelBase
{
public Workspace2ViewModel() => HeaderText = "2";
public string EquipmentField = "Support";
}
internal class WorkspaceViewModelBase : ViewModelBase
{
public string HeaderText { get; set; }
public override string ToString() => HeaderText;
}
Может я вообще запутался и то, что представил выше вообще не правильно Прошу помощи
– Undefined May 16 '21 at 11:20Сделал просто статический класс, и когда добавляю новый узел создаю новый Workspace и добавляю его в коллекцию для отображения (работает) А также изменяю SelectedNode (не работает)))
– Undefined May 16 '21 at 11:34