UWP:如果以编程方式填充,NavigationView.MenuItems 结果为空

UWP: NavigationView.MenuItems results empty if populated programmatically

我在 MainPage.xaml.

中使用 NavigationView (winui 2.4) 创建了一个新的 UWP 项目

我通过绑定分层 ObservableCollection 来填充 NavigationView 菜单项(1 个父项,4 个子项)

启动应用程序,分层结构按预期呈现,似乎工作正常。

我的下一个 objective 是折叠每个展开的菜单项,单击按钮。为此,docs 建议使用 NavigationView.Collapse(NavigationViewItem):我的意图是遍历 NavigationView.MenuItems 并折叠它们。

问题是它似乎 NavigationView.MenuItems returns 空 我不知道为什么。 我包含了一个打印 NavigationView.MenuItems.Count() 的按钮,其中 returns 0.

另一方面,对分层菜单项进行硬编码并重复上述过程似乎效果很好。

MainPage.xaml

<Grid>
    <muxc:NavigationView x:Name="MainNavigation" MenuItemsSource="{x:Bind categories, Mode=OneWay}">
        <muxc:NavigationView.MenuItemTemplate>
            <DataTemplate x:DataType="data:Category" >
                <muxc:NavigationViewItem Content="{x:Bind Name}" MenuItemsSource="{x:Bind Children}" />
            </DataTemplate>
        </muxc:NavigationView.MenuItemTemplate>
        <Button Content="Do Something" Click="Button_Click" />
    </muxc:NavigationView>
</Grid>

MainPage.xaml.cs

public sealed partial class MainPage : Page
    {
        ObservableCollection<Category> categories = new ObservableCollection<Category>();
        public MainPage()
        {
            this.InitializeComponent();

            categories = PopulateHierarchy();
        }

        private ObservableCollection<Category> PopulateHierarchy()
        {
            ObservableCollection<Category> list = new ObservableCollection<Category>();
            ObservableCollection<Category> children = new ObservableCollection<Category>();

            children.Add(new Category { Name = "Child 1" });
            children.Add(new Category { Name = "Child 2" });
            children.Add(new Category { Name = "Child 3" });
            children.Add(new Category { Name = "Child 4" });

            list.Add(new Category { Name = "Test1", Children=children });


            return list;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            int itemsCount = MainNavigation.MenuItems.Count();
            Debug.WriteLine(itemsCount);
        }
    }

Category.cs

public class Category
{
    public string Name { get; set; }
    public ObservableCollection<Category> Children { get; set; }
}

编辑:这似乎是一个已知错误,我在 GitHub 上发现了一个已关闭的问题,但问题仍然存在。

UWP: NavigationView.MenuItems results empty if populated programmatically

我可以重现您的 MenuItems.Count 为零的问题。正如您提供的 link 所说,您还可以获得 MenuItemsSource 属性.

的项目

Collapse方法的参数是NavigationViewItem,我们不能直接将MenuItems元素(数据源类型)传给它。我们需要使用数据源来找到匹配的 NavigationViewItemContainerFromMenuItem 方法是获取带有数据源的 NavigationViewItem 的正确选择。然后 MenuItems 对于这种情况不是必需的。因为categories之前已经贴过。我们可以直接使用它。所以代码可以这样写。

private void Button_Click(object sender, RoutedEventArgs e)
{    
    var container = MainNavigation.ContainerFromMenuItem(categories.First()) as Microsoft.UI.Xaml.Controls.NavigationViewItem;
    MainNavigation.Collapse(container);    
}