1

我有一个带有自己上下文菜单的用户控件,但是我需要向该菜单添加其他项目。

我采用的方法是拥有一个名为 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”)

4

1 回答 1

2

您的“证明”不起作用,因为比较的两个对象显然不相等。您不能在集合容器中使用RelativeSourceElementName绑定,因为没有满足必要的条件,即不存在,NameScope并且由于 CollectionContainer 是一个抽象对象,它没有出现在可视树中,因此也没有可以找到祖先的父对象。

但是,如果您有权访问 UserControl,则可以将Binding.Sourceand ax:Reference用于 UserControl 的名称,以防止出现循环依赖错误,CompositeCollection应在 中定义UserControl.Resources然后使用StaticResource.

例如

<UserControl Name="control">
    <UserControl.Resources>
        <CompositeCollection x:Key="collection">
            <!-- ... -->
            <CollectionContainer Collection="{Binding ContextMenuItems, Source={x:Reference control}, Converter=...}"/>
        </CompositeCollection>
    </UserControl.Resources>
    <!-- ... -->
        <MenuItem ItemsSource="{Binding Source={StaticResource collection}}"/>
</UserControl>
于 2011-07-27T12:36:04.843 回答