C# 首次使用ItemContainerGenerator后如何正确重新生成菜单项?
我有一个简单的xaml代码菜单,其中有一项包含绑定项集合:C# 首次使用ItemContainerGenerator后如何正确重新生成菜单项?,c#,wpf,xaml,C#,Wpf,Xaml,我有一个简单的xaml代码菜单,其中有一项包含绑定项集合: <Menu x:Name="Menu" Focusable="False"> <MenuItem DataContext="{Binding Menu.RootItem}" SubmenuOpened="MenuItem_OnSubmenuOpened" ItemsSource="{Binding ElementName=Menu, Path=DataContext
<Menu x:Name="Menu" Focusable="False">
<MenuItem DataContext="{Binding Menu.RootItem}" SubmenuOpened="MenuItem_OnSubmenuOpened"
ItemsSource="{Binding ElementName=Menu, Path=DataContext.Menu.Items}" >
</MenuItem>
</Menu>
和调用焦点的助手方法
这是第一次很好用。但在那之后,当我调用Focus时,什么都没有发生,Focus返回false。尝试循环该项,但没有成功,因为无法访问该项。没有虚拟化,我尝试使用VirtualzingStackPanel.isVirtualization显式禁用它,但仍然相同。尝试更新Elayout以更新ItemContainerGenerator,但仍然没有更改。我也尝试使用ContainerFromIndex,虽然这是一个很小的变化,但没有实际的区别。
首次使用ItemContainerGenerator后如何正确重新生成菜单项
var root = ((MenuItem) sender);
var items = root.Items;
//tried this one without any success to regenerate UI Children
root.UpdateLayout();
if (items.Count > 0) {
if (root.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated) {
ShowItems(root);
}
else {
EventHandler itemsGenerated = null;
itemsGenerated = delegate {
if (root.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated) {
root.ItemContainerGenerator.StatusChanged -= itemsGenerated;
ShowItems(root);
}
};
root.ItemContainerGenerator.StatusChanged += itemsGenerated;
}
}
private void ShowItems(MenuItem root) {
((MenuItem) root.ItemContainerGenerator.ContainerFromItem(root.Items[0])).Focus();
}