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

核能气质少年 提交于 2021-01-07 01:07:07

问题


Thanks to great @thatguy help I was able to create the menu dynamically, all details and explanation here: How to avoid repeating blocks of XAML in a menu

It works perfectly but my problem is that at the end of the list I need to add a separator and a Delete item. This was the code I was using:

                    <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>

but when I run it I get an error:

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

:(

I could add the Delete item in the list of

public IEnumerable<string> MyTypes { get; } = new List<string>
{
  "PAZ",
  "APP",
  "DEL"
};

but how I can add the separator?


回答1:


I've found a workaround:

                   <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>

Is not exactly what I want but is even more clean. I've created 2 converters for the visibility, one that works with the multibinding for the dynamic menu and one, very similar, that works with the paramenter for the New item and the separator. All dynamic now!



来源:https://stackoverflow.com/questions/65147745/how-to-create-a-contextmenu-with-items-generated-from-binding-and-directly

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!