Context Menu for XAML Treeviewitem (Distinguished by different attributes)
XAML
<TreeView Name="SolutionTree" BorderThickness="0" SelectedItemChanged="SolutionTree_SelectedItemChanged" > <TreeView.Resources> <ContextMenu x:Key ="SolutionContext" StaysOpen="true"> <MenuItem Header="Add..." Click="AddFilesToFolder_Click"/> <MenuItem Header="Rename"/> </ContextMenu> <ContextMenu x:Key="FolderContext" StaysOpen="true"> <MenuItem Header="Add..." Click="AddFilesToFolder_Click"/> <MenuItem Header="Rename"/> <MenuItem Header="Remove"/> <Separator/> <MenuItem Header="Copy"/> <MenuItem Header="Cut"/> <MenuItem Header="Paste"/> <MenuItem Header="Move"/> </ContextMenu> </TreeView.Resources></TreeView>
C-sharp
private void SolutionTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e){ TreeViewItem SelectedItem = SolutionTree.SelectedItem as TreeViewItem; switch (SelectedItem.Tag.ToString()) { case "Solution": SolutionTree.ContextMenu = SolutionTree.Resources["SolutionContext"] as System.Windows.Controls.ContextMenu; break; case "Folder": SolutionTree.ContextMenu = SolutionTree.Resources["FolderContext"] as System.Windows.Controls.ContextMenu; break; }}
You could define the ContextMenu
s in several styles and select the style using a ItemContainerStyleSelector
, based on those attributes.
Or you could directly specify an ItemContainerStyle
and select the appropriate ContextMenu
using triggers
<TreeView> <TreeView.Resources> <ContextMenu x:Key="ScaleCollectionPopup"> <MenuItem Header="New Scale..."/> </ContextMenu> <ContextMenu x:Key="ScaleItemPopup"> <MenuItem Header="Remove Scale"/> </ContextMenu> </TreeView.Resources> <TreeViewItem Header="Scales" ItemsSource="{Binding Scales}" ContextMenu="{StaticResource ScaleCollectionPopup}"> <TreeViewItem.ItemContainerStyle> <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="ContextMenu" Value="{StaticResource ScaleItemPopup}"/> </Style> </TreeViewItem.ItemContainerStyle> </TreeViewItem></TreeView>