【问题标题】:How to create a ContextMenu with items generated from Binding and directly如何使用从 Binding 和直接生成的项目创建 ContextMenu
【发布时间】:2020-12-04 17:09:33
【问题描述】:

感谢@thatguy 的大力帮助,我能够动态创建菜单,所有详细信息和解释都在这里: How to avoid repeating blocks of XAML in a menu

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

                    <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 集合在使用 ItemsSource 之前必须为空。 Source=PresentationFramework

:(

我可以在列表中添加删除项

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

但是如何添加分隔符?

【问题讨论】:

    标签: xaml optimization .net-core binding


    【解决方案1】:

    我找到了解决方法:

                       <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 个转换器,一个与动态菜单的多重绑定一起使用,另一个非常相似,与新项目的参数和分隔符一起使用。 现在全部动态!

    【讨论】:

      猜你喜欢
      • 2019-05-22
      • 2016-05-06
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      相关资源
      最近更新 更多