Как правильно взаимодействовать c командами в классах для иерархии TreeView, чтобы команды брались из класса, где они находятся
У меня есть 3-4 класса, которые составляют некую лесенку сверху-вниз то есть один класс хранит другой как коллекцию и так вниз до нижнего уровня.
И в каждом классе есть команды, которые взаимодействуют со своей коллекцией (удалить, добавить).
Эти классы мне нужно построить в TreeView, что я и сделал с помощью нескольких разных HierarchicalDataTemplate.
Это обобщенный вариант
<HierarchicalDataTemplate x:Key="Template1">
<StackPanel Orientation="Horizontal" Height="25" Margin="-1,-1,0,0" Background="White">
<Button Content="/Components/Images/add.png" Width="20" Height="20" RenderOptions.BitmapScalingMode="Fant" Style="{StaticResource ImageButton}"
Command="{Binding AddCommand}"/>
<Button Content="/Components/Images/delete.png" Width="20" Height="20" RenderOptions.BitmapScalingMode="Fant" Style="{StaticResource ImageButton}"
Command="{Binding DeleteCommand}" CommandParameter="{Binding}"/>
<TextBox Text="{Binding Name}" Margin="5,0,0,0" VerticalAlignment="Center"/>
</StackPanel>
</HierarchicalDataTemplate>
TreeView получается все красиво, но проблема в привязках к командам.
Это код для Header и он имеет команду от первого уровня.
<DataTemplate x:Key="HeaderTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Структура"/>
<Button Content="добавить" Margin="5,0" Style="{StaticResource TextButton}"
Command="{Binding DataContext.Structure.AddCommand, RelativeSource={RelativeSource AncestorType=TreeView}}"/>
</StackPanel>
</DataTemplate>
Слева от "Название" кнопки добавить и удалить я их пока убрал. Если добавление работает и добавляет к нужному "Название" новые элементы, то удаление ищет команду в классе на уровне ниже, где нет коллекции из которой нужно удалить.
Я вижу решение проблемы в следующем:
- Закинуть команды в общую VM и через DataContext я могу к ним обращаться, но получается так что если я добавляю что-то на самый нижней уровень, то сверху придется лазить вниз чтобы добавить, а для этого с собой таскать как бы ссылку или ссылки на нужные промежутки. (Правильно ли такое?)
- Каждый узел как бы имеет ссылку на родителя и тогда, я смогу привязаться к команде на уровень выше или же прям отсюда удалить элемент обращаясь к коллекции в родителе. (Правильно ли такое?)
- Что-то сделать с привязками в xaml (пока не знаю что можно).
- Как то отрисовывать TreeView по другому.
Мой TreeView:
<TreeView Grid.Row="3" Margin="20,15,20,0" BorderThickness="0" FontSize="14">
<TreeViewItem ItemsSource="{Binding коллекция}" IsExpanded="True"
HeaderTemplate="{StaticResource HeaderTemplate}" ItemTemplate="{StaticResource Template1}"/>
</TreeView>
то есть структура TreeView сама строится по типам из ресурсов разных HierarchicalDataTemplate, когда добавляется новый элемент.
