WPF ContextMenu itemtemplate,menuitem中的menuitem

我有以下xaml:

       

TestItemModel类仅包含IsSelected布尔属性和Header字符串属性。

TestItems是TestItemModels的列表。

数据绑定到contextmenu,但它在UI中反映为MenuItem中的MenuItem(具有额外的边距,使菜单非常大)。 我可以通过将DataTemplate中的MenuItem更改为TextBox来解决这个问题,但之后我再也无法绑定IsSelected(我需要可视化属性)。

我对此有几个问题:

  • 为什么MenuItem中有MenuItem? 这对我来说没有意义,因为它没有绑定到menuitem列表而是绑定到TestItemModel列表。
  • 我该如何解决这个问题?

因为MenuItem是容器类型,当它将视图模型转换为可视项时,它会将您的模板包装在MenuItem 。 以同样的方式, ListBox将创建ListBoxItemListView将使用ListViewItem 。 要绑定包装器的属性,您需要使用ItemContainerStyle

      

或者,如果您愿意,可以使用ItemTemplateItemContainerStyle部分地完成

           

在这种情况下, ItemTemplate中的任何内容都将成为MenuItem.Header但仍需要在ItemContainerStyle绑定IsChecked属性