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元素(数据源类型)传给它。我们需要使用数据源来找到匹配的 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);
}
我在 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元素(数据源类型)传给它。我们需要使用数据源来找到匹配的 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);
}