1

我将 TreeViewItems 插入 TreeView 控件并在插入时为每个控件设置样式。我正在分配不同的样式(在 XAML 中预定义),具体取决于我要插入的节点 (TreeViewItem) 的类型。一些样式包括 ContextMenu。

我的问题是我无法在 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);
}
4

2 回答 2

1

使用命令,创建从 ICommand 派生的类,在类中声明可以访问用户控件并且可以在您的 xaml 中访问,并使用该命令绑定按钮。详情见这里_

于 2009-07-23T08:01:14.437 回答
0

另一种选择是在创建MenuItem.Click事件时为事件添加事件处理程序TreeViewItem

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");
    newTerrainNode.AddHandler(MenuItem.Click, OnTreeItemContextMenuClicked);
    tvi.Items.Insert(0,newTerrainNode);
}

private void OnTreeItemContextMenuClicked(object sender, RoutedEventArgs e)
{
    // Handle the ContextMenu item click here
    // e.OriginalSource can be used to get the ContextMenu item clicked if needed.
}
于 2009-07-23T11:06:58.930 回答