Как правильно взаимодействовать 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>

Чтобы получилось так: введите сюда описание изображения

Слева от "Название" кнопки добавить и удалить я их пока убрал. Если добавление работает и добавляет к нужному "Название" новые элементы, то удаление ищет команду в классе на уровне ниже, где нет коллекции из которой нужно удалить.

Я вижу решение проблемы в следующем:

  1. Закинуть команды в общую VM и через DataContext я могу к ним обращаться, но получается так что если я добавляю что-то на самый нижней уровень, то сверху придется лазить вниз чтобы добавить, а для этого с собой таскать как бы ссылку или ссылки на нужные промежутки. (Правильно ли такое?)
  2. Каждый узел как бы имеет ссылку на родителя и тогда, я смогу привязаться к команде на уровень выше или же прям отсюда удалить элемент обращаясь к коллекции в родителе. (Правильно ли такое?)
  3. Что-то сделать с привязками в xaml (пока не знаю что можно).
  4. Как то отрисовывать 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, когда добавляется новый элемент.


Ответы (0 шт):