如何使用绑定生成的项目创建上下文菜单并直接

How to create a ContextMenu with items generated from Binding and directly

感谢@thatguy 的大力帮助,我能够动态创建菜单,所有详细信息和解释都在这里:

它工作得很好,但我的问题是在列表的末尾我需要添加一个分隔符和一个删除项。 这是我使用的代码:

                    <ContextMenu ItemsSource="{Binding MyTypes}" ItemContainerStyle="{StaticResource MyMenuItemStyle}">
                    <Separator HorizontalAlignment="Stretch" Visibility="{Binding MenuSelected.Type, Converter={StaticResource STypeToVisibilityConverter}, ConverterParameter='ANY', Mode=OneWay}" />
                    <MenuItem>
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="Click">
                                <i:InvokeCommandAction Command="{Binding CmdContextMenu}" CommandParameter="DEL" />
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                        <MenuItem.Header>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition Width="*" />
                                </Grid.ColumnDefinitions>
                                <TextBlock
                                    Grid.Column="0"
                                    HorizontalAlignment="Center"
                                    VerticalAlignment="Center"
                                    FontFamily="Segoe MDL2 Assets"
                                    Text="&#xE74D;" />
                                <TextBlock
                                    Grid.Column="1"
                                    Margin="{StaticResource XSmallLeftMargin}"
                                    HorizontalAlignment="Left"
                                    VerticalAlignment="Center"
                                    Text="Delete" />
                            </Grid>
                        </MenuItem.Header>
                    </MenuItem>
                </ContextMenu>
            </TreeView.ContextMenu>

但是当我 运行 它时,我得到一个错误:

Message=Items collection must be empty before using ItemsSource. Source=PresentationFramework

:(

我可以在

的列表中添加删除项
public IEnumerable<string> MyTypes { get; } = new List<string>
{
  "PAZ",
  "APP",
  "DEL"
};

但是如何添加分隔符?

我找到了解决方法:

                   <ContextMenu>
                    <MenuItem ItemsSource="{Binding MyTypes}" ItemContainerStyle="{StaticResource MyMenuItemStyle}" Visibility="{Binding MenuSelected.Type, Converter={StaticResource STypeToVisibilityConverter}, ConverterParameter='ANY', Mode=OneWay}">
                        <MenuItem.Header>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition Width="*" />
                                </Grid.ColumnDefinitions>
                                <TextBlock
                                Grid.Column="0"
                                HorizontalAlignment="Center"
                                VerticalAlignment="Center"
                                FontFamily="Segoe MDL2 Assets"
                                Text="" />
                                <TextBlock
                                Grid.Column="1"
                                Margin="{StaticResource XSmallLeftMargin}"
                                HorizontalAlignment="Left"
                                VerticalAlignment="Center"
                                Text="New" />
                            </Grid>
                        </MenuItem.Header>
                    </MenuItem>
                    <Separator HorizontalAlignment="Stretch" Visibility="{Binding MenuSelected.Type, Converter={StaticResource STypeToVisibilityConverter}, ConverterParameter='ANY', Mode=OneWay}" />
                    <MenuItem>
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="Click">
                                <i:InvokeCommandAction Command="{Binding CmdContextMenu}" CommandParameter="DEL" />
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                        <MenuItem.Header>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition Width="*" />
                                </Grid.ColumnDefinitions>
                                <TextBlock
                                Grid.Column="0"
                                HorizontalAlignment="Center"
                                VerticalAlignment="Center"
                                FontFamily="Segoe MDL2 Assets"
                                Text="&#xE74D;" />
                                <TextBlock
                                Grid.Column="1"
                                Margin="{StaticResource XSmallLeftMargin}"
                                HorizontalAlignment="Left"
                                VerticalAlignment="Center"
                                Text="Delete" />
                            </Grid>
                        </MenuItem.Header>
                    </MenuItem>
                </ContextMenu>

不是我想要的,但更干净。 我为可见性创建了 2 个转换器,一个与动态菜单的多重绑定一起使用,另一个非常相似,与新项目的参数和分隔符一起使用。 现在所有动态!