C# 使用DataTemplates绑定动态上下文菜单项

C# 使用DataTemplates绑定动态上下文菜单项,c#,wpf,data-binding,contextmenu,C#,Wpf,Data Binding,Contextmenu,我有一个应用程序,需要一个动态上下文菜单,可以改变每个项目。我实现这一点的方法是使用Name和Command属性创建一个可绑定对象。我不想在viewmodel中创建UI MenuItem对象。我将ContextMenu.ItemsSource绑定到这个集合,并设置了一个项目模板,它基本上运行良好,只是没有使用分隔符。我稍微改变了我的方法,所以我为两个模型对象中的一个定义了两个DataTemplates,并且不再设置项模板,因为它现在必须在菜单项和分隔符模板之间切换。问题是它现在根本不使用这些模板

我有一个应用程序,需要一个动态上下文菜单,可以改变每个项目。我实现这一点的方法是使用Name和Command属性创建一个可绑定对象。我不想在viewmodel中创建UI MenuItem对象。我将ContextMenu.ItemsSource绑定到这个集合,并设置了一个项目模板,它基本上运行良好,只是没有使用分隔符。我稍微改变了我的方法,所以我为两个模型对象中的一个定义了两个DataTemplates,并且不再设置项模板,因为它现在必须在菜单项和分隔符模板之间切换。问题是它现在根本不使用这些模板。我只是得到了类项目的标准ToString。我的模板在此处的同一文件中定义:

<DataTemplate DataType="{x:Type contracts:BindableMenuItem }">
    <MenuItem DataContext="{Binding}" Header="{Binding MenuItemHeader}" Command="{Binding MenuCommand}" />
</DataTemplate>

<DataTemplate DataType="{x:Type contracts:BindableMenuSeparator }">
    <Separator />
</DataTemplate>

但这些东西永远不会被使用。我遗漏了什么?

看起来您误解了DataTemplate如何应用于类型。此类型应该是不从FrameworkElement继承的内容类型,或者任何内容都可以自己呈现。所以在本例中,我猜您的BindableMenuItem和BindableMenuSeparator是自定义控件?如果是这样,DataTemplate将不会有任何效果。@KingKing感谢您的回复。不,这些是模型,尽管命名不同。完全没有控制。我想要一个模型端的表示,它可以最终绑定到真正的MenuItem控件,而不引用viewmodel中的UI类。我想,如果ContextMenu.ItemsSource指向包含这两种类型的混合的集合,则DataTemplates将确保它们正确呈现。您能否发布viewmodel代码的外观,也就是说,具有BindableMenuItems的属性我猜是一个集合?。