。使用ItemContainerTemplate的.Net Core WPF MVVM菜单不起作用

问题描述 投票:2回答:1

我在.NET Framework的WPF应用程序中使用了MVVM菜单方法。转换为.NET Core 3.1后,该方法不再起作用。

问题:这是WPF中的错误吗?有人知道解决方案或解决方法吗?

。NET Framework 4.7.2的最终结果。

enter image description here

。NET Core 3.1中的相同代码将在MenuItem(?)中显示MenuItem。子菜单不出现。

enter image description here

这里是视图模型的简化版本。

using System.Collections.ObjectModel;

namespace WpfMenuFw
{
    class MainVm
    {
        public ObservableCollection<MenuVm> MenuVms { get; set; } = new ObservableCollection<MenuVm>();
    }

    abstract class MenuVm
    {
    }

    class MenuSeparatorVm : MenuVm
    {
    }

    class MenuItemVm : MenuVm
    {
        public string Header { get; set; } = nameof(MenuItemVm);
    }

    class MenuGroupVm : MenuVm
    {
        public string Header { get; set; } = nameof(MenuGroupVm);
        public ObservableCollection<MenuVm> MenuVms { get; set; } = new ObservableCollection<MenuVm>();
    }
}

XAML

<Window
    x:Class="WpfMenuFw.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WpfMenuFw"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="800"
    Height="450"
    d:DataContext="{d:DesignInstance local:MainVm}"
    mc:Ignorable="d">
    <Window.Resources>

        <ItemContainerTemplate DataType="{x:Type local:MenuSeparatorVm}">
            <Separator />
        </ItemContainerTemplate>

        <ItemContainerTemplate DataType="{x:Type local:MenuGroupVm}">
            <MenuItem
                d:DataContext="{d:DesignInstance local:MenuGroupVm}"
                Header="{Binding Header}"
                ItemsSource="{Binding MenuVms}"
                UsesItemContainerTemplate="True" />
        </ItemContainerTemplate>

        <ItemContainerTemplate DataType="{x:Type local:MenuItemVm}">
            <MenuItem 
                d:DataContext="{d:DesignInstance local:MenuItemVm}" 
                Header="{Binding Header}" />
        </ItemContainerTemplate>

    </Window.Resources>
    <Window.DataContext>
        <local:MainVm>
            <local:MainVm.MenuVms>
                <local:MenuGroupVm Header="Group 1">
                    <local:MenuGroupVm.MenuVms>
                        <local:MenuItemVm Header="Item A1" />
                        <local:MenuSeparatorVm />
                        <local:MenuItemVm Header="Item A2" />
                    </local:MenuGroupVm.MenuVms>
                </local:MenuGroupVm>
                <local:MenuGroupVm Header="Group 2">
                    <local:MenuGroupVm.MenuVms>
                        <local:MenuItemVm Header="Item B1" />
                        <local:MenuItemVm Header="Item B2" />
                    </local:MenuGroupVm.MenuVms>
                </local:MenuGroupVm>
            </local:MainVm.MenuVms>
        </local:MainVm>
    </Window.DataContext>
    <DockPanel>

        <Menu
            DockPanel.Dock="Top"
            IsMainMenu="True"
            ItemsSource="{Binding MenuVms}"
            UsesItemContainerTemplate="True" />

        <TextBlock Text="MainContent">
            <TextBlock.ContextMenu>
                <ContextMenu 
                    ItemsSource="{Binding MenuVms}"
                    UsesItemContainerTemplate="True" />
            </TextBlock.ContextMenu>
        </TextBlock>

    </DockPanel>
</Window>
wpf .net-core menu contextmenu
1个回答
0
投票

已报告此问题github link here

您应使用以下解决方法,直到问题解决。

  • 为Menu或MenuItem设置项目面板的模板。

  • 或者您可以在MenuItem的ControlTemplate中执行类似的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.