2014-05-09 4 views
1

J'ai la tâche "simple" pour avoir un ContextMenu sur un TreeView (Element) qui est fait dans MVVM-way. Lorsque je cherchais sur le Web, j'ai trouvé des solutions que je pouvais utiliser avec des boutons, mais pas avec TreeView. Je pense que le problème consiste à définir la propriété ItemsSource de TreeView qui donne à chaque élément un propre DataContext.ContextMenu sur TreeView-Element dans MVVM-style

Voici mon petit test-App où vous pouvez voir le travail principe de bouton, mais pas pour les TreeView-éléments:

MainWindow.xaml:

<Window x:Class="ContextMenu.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <Grid > 
     <StackPanel> 
      <TextBlock Text="{Binding MyText}" /> 

      <Button Tag="{Binding DataContext,RelativeSource={RelativeSource Mode=Self}}" Content="Click me"> 
       <Button.ContextMenu> 
        <ContextMenu> 
         <MenuItem Header="{Binding PlacementTarget.Tag.MyText, 
          RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu}}" /> 
        </ContextMenu> 
       </Button.ContextMenu> 
      </Button> 

      <TreeView ItemsSource="{Binding MyList}" Tag="{Binding DataContext, RelativeSource={RelativeSource Mode=Self}}"> 
       <TreeView.ItemTemplate> 
        <HierarchicalDataTemplate> 
         <TextBlock Text="{Binding Name}"> 
          <TextBlock.ContextMenu> 
           <ContextMenu> 
            <MenuItem Header="{Binding Path=PlacementTarget.Tag.MyText, 
             RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}" /> 
           </ContextMenu> 
          </TextBlock.ContextMenu> 
         </TextBlock> 
        </HierarchicalDataTemplate> 
       </TreeView.ItemTemplate>   
      </TreeView> 

     </StackPanel>   
    </Grid> 
</Window> 

Codebehind:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new MainWindowVM(); 
    } 
} 

MainWindowVM.cs:

public class MainWindowVM 
{ 
    public string MyText { get; set; } 
    public ObservableCollection<TreeElement> MyList { get; set; } 

    public MainWindowVM() 
    { 
     MyText = "This is my Text!"; 
     MyList = new ObservableCollection<TreeElement>(); 
     MyList.Add(new TreeElement("String 1")); 
     MyList.Add(new TreeElement("String 2")); 
    } 
} 

public class TreeElement 
{ 
    public string Name { get; set; } 
    public TreeElement(string Name) 
    { 
     this.Name = Name; 
    } 
} 

Merci pour votre aide !! Joerg

Répondre

1

Vous êtes proche.

Qu'est-ce que vous faites:

  1. vous définissez les Tag de TreeView à sa propre DataContext. Ceci est inutile.
  2. vous essayez d'obtenir Tag.MyText de votre ContextMenu.PlacementTarget - qui est TextBlock. Le TextBlock n'a pas de jeu Tag.

Ce que vous devez faire:

  1. régler la Tag du TextBlock-DataContext de la fenêtre (fenêtre est l'ancêtre TextBlock et vous devriez le regarder via RelativeSource Mode=FindAncestor).
  2. la deuxième partie est OK - vous avez TextBlock.Tag mis dans la première étape.
+0

Nous vous remercions de votre aide. Je n'avais pas la "compréhension globale" des tags de placement et des tags ... après votre réponse c'était clair :) – joerg