1

我在 MainPage.xaml 中创建了一个带有NavigationView(winui 2.4)的新 UWP 项目。

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

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

NavigationView 层次结构正确呈现

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

问题是它似乎NavigationView.MenuItems返回空,我不知道为什么。我包含了一个打印的 Button NavigationView.MenuItems.Count(),它返回 0。

另一方面,对分层菜单项进行硬编码并重复上述过程似乎可以正常工作。

主页.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);
        }
    }

类别.cs

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

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

4

1 回答 1

1

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

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

方法的参数CollapseNavigationViewItem,我们不能直接将 MenuItems 元素(数据源类型)传递给它。我们需要使用数据源找到匹配NavigationViewItem的,该ContainerFromMenuItem方法是获取带有数据源的 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);    
}
于 2020-11-13T02:14:57.510 回答