我有一个带有自己上下文菜单的用户控件,但是我需要向该菜单添加其他项目。
我采用的方法是拥有一个名为 ContextMenuItems 的依赖属性:
Public Shared ReadOnly ContextMenuItemsProperty As DependencyProperty = DependencyProperty.Register("ContextMenuItems", GetType(ObservableCollection(Of MenuItem)), GetType(SmartDataControl), New FrameworkPropertyMetadata(New ObservableCollection(Of MenuItem)))
Public Property ContextMenuItems As ObservableCollection(Of MenuItem)
Get
Return GetValue(ContextMenuItemsProperty)
End Get
Set(ByVal value As ObservableCollection(Of MenuItem))
SetValue(ContextMenuItemsProperty, value)
End Set
End Property
然后我使用 CompositeCollection 将控件中的静态菜单项与主机提供的列表结合起来:
<CompositeCollection x:Key="MenuItemsCompositeCollection">
<MenuItem Header="TEST" />
<CollectionContainer Collection="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=ContextMenuItems, Converter={StaticResource TestConverter}}" />
<MenuItem Header="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=ContextMenuItems}" />
</CompositeCollection>
当我绑定到该资源时,我看到的是:
- 测试
- (收藏)
第二个菜单项绑定到集合以证明我可以访问它。我有一个已添加到菜单项的测试转换器,它在转换器方法中中断,但是当我将转换器添加到 CollectionContainer 时,它不会被调用。
最后,我在输出窗口中收到以下错误:
System.Windows.Data 错误:4:找不到与引用“RelativeSource FindAncestor,AncestorType='System.Windows.Controls.UserControl',AncestorLevel='1''的绑定源。绑定表达式:路径=上下文菜单项;数据项=空;目标元素是'CollectionContainer'(HashCode=41005040);目标属性是“集合”(类型“IEnumerable”)