如何解决UWP:如果以编程方式填充,NavigationView.MenuItems结果为空
我在MainPage.xaml中使用NavigationView
(winui 2.4)创建了一个新的UWP项目。
我首先绑定了层次结构ObservableCollection
,以填充NavigationView
菜单项(1个父级,4个子级)
启动应用程序后,层次结构将按预期方式呈现,并且似乎运行良好。
我的下一个目标是折叠每个扩展菜单项并单击按钮。为此,docs建议使用NavigationView.Collapse(NavigationViewItem)
:我的目的是迭代NavigationView.MenuItems
并将其折叠。
问题是似乎NavigationView.MenuItems
返回空,但我不知道为什么。
我包括了一个打印NavigationView.MenuItems.Count()
的按钮,该按钮返回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结果为空
我可以重现您的问题,即MenuItems.Count为零。正如您的提供链接所说,您还可以获得具有MenuItemsSource
属性的商品。
Collapse
方法的参数为NavigationViewItem
,我们无法将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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。