Je pense que ce problème devrait être résolu d'une autre manière, mais ...
- vous auriez la commande sur votre modèle vue comme une propriété. Vous dérivez de treeview et treeview item.
- Vous donnez l'élément TreeView une propriété de commande , vous liez cela la commande de modèle de votre vue dans les vues d'arbres ItemContainerStyle (en le XAML)
- vous substituez la souris aperçu vers le bas sur l'arborescence élément à appelez la commande
ici est un exemple TreeViewItem
public class EditableTreeViewItem : TreeViewItem {
public ICommand DoubleClickCommand {
get { return (ICommand)GetValue(DoubleClickCommandProperty); }
set { SetValue(DoubleClickCommandProperty, value); }
}
// Using a DependencyProperty as the backing store for DoubleClickCommand. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DoubleClickCommandProperty =
DependencyProperty.Register("DoubleClickCommand", typeof(ICommand), typeof(EditableTreeView), new UIPropertyMetadata(null));
protected override void OnPreviewMouseDoubleClick(MouseButtonEventArgs e) {
if (this.DoubleClickCommand!= null) {
this.DoubleClickCommand.Execute(this.DataContext);
e.Handled = true;
}
base.OnPreviewMouseDoubleClick(e);
}
protected override DependencyObject GetContainerForItemOverride() {
return new EditableTreeViewItem();
}
protected override bool IsItemItsOwnContainerOverride(object item) {
return item is EditableTreeViewItem;
}
}
et TreeView utiliser cet objet
public class EditableTreeView : TreeView {
//generate the tree view item
protected override DependencyObject GetContainerForItemOverride() {
EditableTreeViewItem item = new EditableTreeViewItem();
return item;
}
protected override bool IsItemItsOwnContainerOverride(object item) {
return item is EditableTreeViewItem;
}
}
maintenant que certaines personnes intelligentes ont dit plus haut, vous seriez mieux à l'aide d'un menu et un style. maintenant, lorsque vous double-cliquez sur l'élément treeview, il appellera la commande au lieu d'étendre/réduire comme il se doit.
Voici comment vous utiliseriez dans le XAML
<controls:EditableTreeViewMode=OneWayToSource}"
ItemsSource="{Binding Path=MyItemsSource}">
<controls:EditableTreeView.ItemContainerStyle>
<!-- This Style binds a TreeViewItem to a the ViewModel. -->
<Style
TargetType="{x:Type controls:EditableTreeViewItem}">
<Setter
Property="DoubleClickCommand"
Value="{Binding OpenNewWindowCommand}" />
</Style>
</controls:EditableTreeView.ItemContainerStyle>
</controls:EditableTreeView>
Plutôt que de savoir comment faire un TreeView se comporte comme un menu, pourquoi ne pas utiliser un menu et utilisez templating personnalisé pour le présenter dans un TreeView -comme moyen? Dans WPF, il est généralement plus facile d'utiliser le contrôle avec le comportement souhaité et de modifier son apparence que d'utiliser le contrôle avec l'apparence désirée et de modifier son comportement. – itowlson
je suis d'accord avec itowlson –
+1 itowlson. Si vous voulez un menu qui ressemble à une arborescence, utilisez un menu et le style – Zied