In XAML, how do you define a context menu for treeviewitems that are distinguished by different attributes?
+2
A:
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
Thomas Levesque
2009-09-14 13:28:04
Sounds like a better approach. Need to still learn styles. Thanks.
Mr. T.
2009-09-15 10:28:51
+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.
2009-09-15 10:16:26
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
2010-03-26 23:56:33