Итак, я провел некоторое тестирование, и лучший способ найти это - не использовать ContextMenu в разделе «Ресурсы», а использовать «ViewModelViewHost», как показано ниже:
<TreeView x:Name="TheTreeView">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding ListOfItemType_2 }" DataType="{x:Type local:ItemType_1ViewModel}">
<rxui:ViewModelViewHost ViewModel="{Binding}"/>
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:ItemType_2ViewModel }" >
<rxui:ViewModelViewHost ViewModel="{Binding}"/>
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Код, стоящий за привязкой ReactiveUIдля элементов TreeView:
public FunctionTreeView()
{
InitializeComponent();
this.WhenActivated(
dis =>
{
this.WhenAnyValue(x => x.ViewModel).BindTo(this, x => x.DataContext).DisposeWith(dis);
this.OneWayBind(ViewModel, vm => vm.ItemType_1ViewModelList , x => x.TheTreeView.ItemsSource).DisposeWith(dis);
});
}
Затем добавьте контекстные меню в ItemType_1View и ItemType_2View, что позволит использовать привязки ReactiveUI.Единственным недостатком является то, что ItemType_1ViewModel и ItemType_2ViewModel должны иметь ссылку на команду, команды не могут быть в ViewModel TreeView.
<UserControl.ContextMenu>
<ContextMenu>
<MenuItem x:Name="MenuItem_RunCommand" Header="Run" />
<MenuItem x:Name="MenuItem_InformationCommand" Header="Show Information"/>
</ContextMenu>
</UserControl.ContextMenu>
И код:
public ItemType_2View()
{
InitializeComponent();
this.WhenActivated(dis =>
{
this.BindCommand(ViewModel, vm => vm.RunCommand, v => v.MenuItem_RunCommand).DisposeWith(dis);
});
Также необходимо зарегистрировать виды:
dependencyResolver.Register(() => new ItemType_1View (), typeof(IViewFor<ItemType_1ViewModel>));
dependencyResolver.Register(() => new ItemType_2View (), typeof(IViewFor<ItemType_2ViewModel>));
Вот и все, я думаю.Я надеюсь, что кто-то еще находит это полезным:)