22
Aug
07

ContextMenu et TreeView


Lorsqu'on utilise on ContextMenu dans un TreeView, il est normal de vouloir récupérer l'objet lié au noeud en cours.

Par exemple si nous avons le TreeView suivant en XAML:

    <TreeView x:Name="myTreeView">
<
TreeView.ItemTemplate>
<
HierarchicalDataTemplate
ItemsSource
="{Binding Path=path}">

<
TextBlock x:Name="node" Text="{Binding Path=Text}" >
<
TextBlock.ContextMenu>
<
ContextMenu>
<
MenuItem Header="_Click Me"
Click
="ctxClickMe_OnClick"/>
</ContextMenu>
</
TextBlock.ContextMenu>
</
TextBlock>
</
HierarchicalDataTemplate>
</
TreeView.ItemTemplate>
</
TreeView>

 

Pour cela, il existe plusieurs solutions. En voilà  deux:

La première consiste à  ajouter une référence sur l'objet binder à  l'aide de la propriété Tag.

<MenuItem Header="_Click Me" 
Click="ctxClickMe_OnClick"
Tag="{TemplateBinding Content}"/>

 

Dans le code behind on écrira l'event handler suivant:

protected void ctxClickMe_OnClick(object sender,  
RoutedEventArgs
e) { MenuItem menuItem = sender as MenuItem; Foo foo = menuItem.Tag as Foo; MessageBox.Show(foo.Id.ToString()); }

 

Malheureusement, cette méthode nous force à  référencer l'objet lié sur tous les MenuItem.

 

La seconde solution nous évite cela en modifiant l'event handler de la faà§on suivant:

protected void ctxClickMe_OnClick(object sender,  
RoutedEventArgs
e) { MenuItem menuItem = (MenuItem)sender; ContextMenu menu = (ContextMenu)menuItem.Parent; TextBlock block = (TextBlock)menu.PlacementTarget; Foo foo = block.DataContext as Foo; MessageBox.Show(foo.Id.ToString()); }

 

En fait on remonte la hierarchie du MenuItem jusqu'à  l'objet qui contient notre ContextMenu, ici un TextBlock, et on récupère le DataContext de cet objet.



0 Responses to “ContextMenu et TreeView“


    There are no comments yet...Kick things off by filling out the form below.

Leave a Reply