为什么 MenuFlyout.Items 在 Closing 事件中总是 null?

Why is MenuFlyout.Items always null in Closing event?

我可以在 ContextMenuFlyout_Opening 事件中成功地将 MenuFlyoutItem 添加到 MenuFlyout 动态,但是当我尝试在 ContextMenuFlyout_Closing 中将其删除时,MenuFlyout.Items 始终为空并且 MFI 不存在找到并删除。

知道为什么会这样吗?

<Page.Resources>
    <MenuFlyout
    x:Key="ListViewContextMenu"
    Closing="{x:Bind ViewModel.ContextMenuFlyout_Closing}"
    Opening="{x:Bind ViewModel.ContextMenuFlyout_Opening}">

    <MenuFlyoutItem
        Click="{x:Bind ViewModel.EditParty}"
        Icon="Edit"
        Text="Edit" />

    <MenuFlyoutItem Text="Open in new window">
        <MenuFlyoutItem.Icon>
            <FontIcon
                FontFamily="Segoe MDL2 Assets"
                FontSize="40"
                Glyph="&#xE8A7;" />
        </MenuFlyoutItem.Icon>
    </MenuFlyoutItem>

    <MenuFlyoutSeparator />

    <MenuFlyoutItem
        Click="MenuFlyoutItem_Click"
        Icon="Delete"
        Text="Delete" />

    </MenuFlyout>
</Page.Resources>

ViewModel 事件处理程序

public void ContextMenuFlyout_Opening(object sender, object e)
{
    MenuFlyout flyout = sender as MenuFlyout;
    if (flyout != null)
    {
        // If party.IsConflict = true then add the MFI
        if (SelectedTalent.IsConflict)
        {
            flyout.Items.Add(new MenuFlyoutItem()
            {
                Icon = new FontIcon() { Glyph = "\uEC4F" },
                Text = "Resolve Conflict"
            });
        }
    }           
}

public void ContextMenuFlyout_Closing(object sender, object e)
{
    // Remove 'Resolve Conflict' MFI if its found

    MenuFlyout flyout = sender as MenuFlyout;
    if (flyout != null)
    {
        var rc = flyout.Items.FirstOrDefault(o => o.Name == "Resolve Conflict");
        if (rc != null)
        {
            flyout.Items.Remove(rc);
        }
    }
}

使用 MenuFlyout 的 ListView

    <ListView
    ContextFlyout="{StaticResource ListViewContextMenu}"

根据您的代码,您似乎正试图通过名称获取 MenuFlyoutItem 对象。但是你忘记给 MenuFlyoutItem 对象一个 Name 当你把它添加到 MenuFlyout 时,你只是添加了一个 Text 属性.

  flyout.Items.Add(new MenuFlyoutItem()
                {
                    Icon = new FontIcon() { Glyph = "\uEC4F" },
                    Text = "Resolve Conflict",
                    Name = "Resolve Conflict",
                });