如何从 TreeView ContextMenu 获取 MenuItem 单击事件
我将 TreeViewItems 插入到 TreeView 控件中,并在插入时设置每个项目的样式。 我根据要插入的节点 (TreeViewItem) 的类型分配不同的样式(在 XAML 中预定义)。 一些样式包括上下文菜单。
我的问题是我无法在 MenuItems 上使用 Click="MyHandler"; 我收到错误“根元素需要 ax:Class 属性来支持 XAML 文件中的事件处理程序。” 显然 Style 块中的元素都不是根元素。
任何建议都非常感激。
XAML:
<Style x:Key="Terrain" TargetType="{x:Type TreeViewItem}">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Canvas Background="{DynamicResource Terrain_icon}" />
<TextBlock Text="{Binding}" />
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem Header="Edit..." Click="MyHandler"/> <!-- Error -->
<MenuItem Header="Add..."/>
<MenuItem Header="Delete"/>
</ContextMenu>
</StackPanel.ContextMenu>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
C#:
private void InsertTerrainNode(object sender, System.Windows.RoutedEventArgs e)
{
// Add the new item under the first-level TreeViewItem
TreeViewItem tvi = myTree.ItemContainerGenerator.ContainerFromItem(myTree.Items[0]) as TreeViewItem;
TreeViewItem newTerrainNode = new TreeViewItem();
newTerrainNode.Header = "Terrain";
newTerrainNode.Style = (Style)this.FindResource("Terrain");
tvi.Items.Insert(0,newTerrainNode);
}
I am inserting TreeViewItems into a TreeView control and setting the style for each at the time of insertion. I am assigning different styles (predefined in XAML), depending on the type of node (TreeViewItem) I want to insert. Some of the styles include a ContextMenu.
My problem is that I am unable to use Click="MyHandler" on the MenuItems; I get an error "root element requires a x:Class attribute to support event handlers in the XAML file." and apparently none of the elements within the Style block are root elements.
Any suggestions much appreciated.
XAML:
<Style x:Key="Terrain" TargetType="{x:Type TreeViewItem}">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Canvas Background="{DynamicResource Terrain_icon}" />
<TextBlock Text="{Binding}" />
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem Header="Edit..." Click="MyHandler"/> <!-- Error -->
<MenuItem Header="Add..."/>
<MenuItem Header="Delete"/>
</ContextMenu>
</StackPanel.ContextMenu>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
C#:
private void InsertTerrainNode(object sender, System.Windows.RoutedEventArgs e)
{
// Add the new item under the first-level TreeViewItem
TreeViewItem tvi = myTree.ItemContainerGenerator.ContainerFromItem(myTree.Items[0]) as TreeViewItem;
TreeViewItem newTerrainNode = new TreeViewItem();
newTerrainNode.Header = "Terrain";
newTerrainNode.Style = (Style)this.FindResource("Terrain");
tvi.Items.Insert(0,newTerrainNode);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使用命令,创建一个从 ICommand 派生的类,在该类中声明可以访问用户控件并且可以在 xaml 中访问并使用该命令绑定按钮。 请参阅此处 详细信息
Use commands, create a class derived from ICommand, declare in the class that have access to user controles and is accessible in your xaml and bind button with that command. see here for detailes
另一种选择是在创建
TreeViewItem
时将MenuItem.Click
事件的事件处理程序添加到该TreeViewItem
中。Another option is to add an event handler for the
MenuItem.Click
event to theTreeViewItem
as you create it.