Context Menu for XAML Treeviewitem (Distinguished by different attributes) Context Menu for XAML Treeviewitem (Distinguished by different attributes) wpf wpf

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 ContextMenus 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>