Вы должны связываться с коллекцией, чьи объекты имеют коллекцию как открытое свойство и шаблонизировать по типу все, что вы хотите видеть в каждом элементе дерева.
Как в этом примере: https://docs.microsoft.com/en-us/dotnet/api/system.windows.hierarchicaldatatemplate?view=netframework-4.7.2
Технически, вы могли бы иметь кнопку, шаблон которой был бы текстовым блоком или чем-то еще, и тогда бы поведение кнопки было таким, как нажатие и команда.Но я бы с большей вероятностью использовал привязку ввода.
Вот пример:
<DataTemplate DataType="{x:Type local:LineTerrainVM}">
<Grid Background="Transparent">
<Grid.InputBindings>
<MouseBinding MouseAction="RightClick" Command="{Binding FixLineCommand}"/>
</Grid.InputBindings>
Вы можете дать этому параметру команды = "{Binding.}", И он пройдетviewmodel в качестве параметра.Вы также можете использовать родственный источник в текстовом виде древовидного представления, чтобы перейти к родительской модели представления и определить в ней команду для выполнения своих задач.
Поскольку эти вещи, которые вы хотите сделать, являются обязанностью просмотра, на которую можно положиться,события без "взлома" мввм.Щелчок в любом древовидном элементе может быть обработан на уровне древовидного объекта и использовать источник originals для перехода к нажатому древовидному элементу.Затем возьмите его datacontext для модели представления чего бы то ни было.Грубая идея:
<TreeView Name="tv" ItemsSource="{Binding Families}" FrameworkElement.PreviewMouseLeftButtonDown="Tv_PreviewMouseLeftButtonDown"
И обработчик:
private void Tv_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var vm = ((FrameworkElement)e.OriginalSource).DataContext;
// do something with viewmodel
}
Затем вы можете сделать что-то вроде нового в своем диалоговом окне, установить его datacontext для той только что полученной вами модели представления и показать ее диалог.