绑定资源中的上下文菜单ItemsSource

时间:2017-10-09 13:58:02

标签: c# wpf xaml

在我的资源中,我创建了一个上下文菜单,我希望将它的ItemsSource属性绑定到我创建的名为ObservableCollection<object>的{​​{1}}属性在我的ContextMenuItems中填充了用于表示菜单项的项目。目前,它看起来像这样

xaml.cs

然后在我的视线中

<UserControl.Resources>
    <ContextMenu x:Key="ContextMenu"
             DataContext="{Binding}"
             ItemsSource="{Binding ContextMenuItems}">
       <ContextMenu.Resources>
           <DataTemplate DataType="{x:Type local:CtContextMenuItem}">
                   <MenuItem Header="{Binding Header}"
                          Click="MenuItem_OnClick"
                          Visibility="{Binding Visibility}"
                          IsEnabled="{Binding IsEnabled}" />
           </DataTemplate>
           <DataTemplate DataType="{x:Type local:CtContextMenuSepparatorItem}">
               <Separator />
           </DataTemplate>
       </ContextMenu.Resources>
   </ContextMenu>
</UserControl.Resources>

<TreeView ContextMenu="{DynamicResource = ContextMenu}"> <TreeView.Resources> <HierarchicalDataTemplate DataType="{x:Type local:CustomizableTreeBaseItem}" ItemsSource="{Binding TreeChildren}"> <TextBlock Text="{Binding Header}" ContextMenu="{DynamicResource = ContextMenu}/> </HierarchicalDataTemplate> </TreeView.Resources> </TreeView> TreeChildren上的公共属性,它包含公共属性,然后绑定到树视图的项目。从代码隐藏设置了树视图的Items属性的local:CustomizableTreeBaseItem的Observable集合。

但是,当我右键单击树视图中的项目时,这似乎不起作用我没有像我预期的那样获得上下文菜单。
我试图查找是否需要创建一个以某种方式绑定到该属性的资源,但似乎没有办法解决这个问题。 我也试图绑定数据上下文,但我似乎无法想出一条可行的路径。

1 个答案:

答案 0 :(得分:1)

如果在定义ContextMenuItems资源的UserControl的代码隐藏中定义了ContextMenu属性,则可以指定RelativeSource

<ContextMenu x:Key="ContextMenu"
             ItemsSource="{Binding ContextMenuItems, RelativeSource={RelativeSource AncestorType=UserControl}}">
    <ContextMenu.Resources>
        ...
    </ContextMenu.Resources>
</ContextMenu>