具有项目源和附加项的上下文子菜单

时间:2011-03-10 18:27:17

标签: c# .net wpf

我在wpf中有一个上下文菜单。菜单中的一个项目有一个子菜单,可以从标题菜单项的ItemsSource填充。此子菜单是可以发送到应用程序的另一部分的命令列表。该列表基本上是一个限制为10个项目的mru列表。我想添加一个分隔符,然后在10个项目列表下面添加一个“更多”选项,这样用户就可以看到整个可用命令列表。我似乎无法弄清楚如何添加这些额外的项目。我可以从父菜单项的ItemsSource动态填充列表,但我似乎无法弄清楚如何将其他项添加到子菜单的底部。我不想将它们放在项目源中,而“更多”项目需要有自己的命令。

<MenuItem x:Name="ExecuteCommandMenuItem" Height="22" Style="{StaticResource RightClickMenuItemStyle}"
                          ItemsSource="{Binding Path=PanelCommands}">
                    <MenuItem.Header>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="Panel Command" HorizontalAlignment="Left" Width="100"/>
                        </StackPanel>
                    </MenuItem.Header>

                    <MenuItem.ItemContainerStyle>
                        <Style TargetType="MenuItem" BasedOn="{StaticResource RightClickMenuItemStyle}">
                            <Setter Property="MenuItem.Header" Value="{Binding}" />
                            <Setter Property="MenuItem.Command" Value="CommonCommands:CommandRepository.ExecutePanelCommand" />
                            <Setter Property="MenuItem.CommandParameter">
                                <Setter.Value>
                                    <MultiBinding Converter="{CommonConverter:PanelCommandArgsConverter}">
                                        <MultiBinding.Bindings>
                                            <Binding Path="DataContext" RelativeSource="{RelativeSource FindAncestor, 
                                                             AncestorType={x:Type ContextMenu}}"/>
                                            <Binding Path="Command" />
                                        </MultiBinding.Bindings>
                                    </MultiBinding>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </MenuItem.ItemContainerStyle>
                </MenuItem>

感谢。

2 个答案:

答案 0 :(得分:2)

<DataGrid x:Class="UICCNET.BaseControls.UserControls.BaseDataGrid"
         Tag="{Binding RelativeSource={RelativeSource Self}, Path=Columns}">
<DataGrid.ContextMenu>
    <ContextMenu Tag="{Binding RelativeSource={RelativeSource Self},Path=PlacementTarget.Tag}">
        <MenuItem Header="Колонки">
        <MenuItem  >              
            <MenuItem.Template>
                <ControlTemplate>
                        <ListBox  Name="MyComboBox"  ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}},Path=Tag}">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <CheckBox IsChecked="{Binding Path=Visibility, Mode=TwoWay, Converter={StaticResource BooleanToVisibilityConverter1}}" Content="{Binding Path=Header}"></CheckBox>
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
                    </ControlTemplate>
            </MenuItem.Template>
                 </MenuItem>
        </MenuItem>
        <MenuItem Header="Друк"></MenuItem>
    </ContextMenu>
</DataGrid.ContextMenu>

答案 1 :(得分:0)

我认为你不能因为它与某个来源有关。因此要么将它们添加到源中,要么使用模板选择器并在那里执行逻辑。定义普通模板,然后定义“更多”模板。

或者,您可以执行一些控件嵌套,如

<menu>
<stackpanel>
<Menu Items>

</menu Items>
<break />
<Button>More</button>
</stackpanel>
</menu>

对不起,这只是我的头脑。你可以发布你的XAML吗?