views:

1430

answers:

2

In XAML, how do you define a context menu for treeviewitems that are distinguished by different attributes?

+2  A: 

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

Thomas Levesque
Sounds like a better approach. Need to still learn styles. Thanks.
Mr. T.
+2  A: 

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;
                }
            }
Mr. T.
Sometimes it is just easier to do it in code rather than xaml. I'm not a purest and this works well. Thanks Mr T.
BrettRobi