我有一个ToolBar
ItemsTemplate
,在OverflowPanel
可用之前一直正常工作。
如果我选择其中一个上下文操作,则OverflowPanel
不会关闭。
只有通过ItemsSource
绑定添加项目时才会出现问题:
<ToolBar ItemsSource="{Binding ContextActionViewModels}"
Background="Transparent"
ToolBarTray.IsLocked="True"
FocusManager.IsFocusScope="False">
<ToolBar.ItemTemplateSelector>
<views:ContextActionTemplateSelector>
<views:ContextActionTemplateSelector.SimpleContextActionDataTemplate>
<DataTemplate DataType="{x:Type viewModels:SimpleContextActionViewModel}">
<Button Name="Button"
Command="{Binding ActionCommand}"
Style="{StaticResource ToolBarButtonStyle}"
ToolTip="{userInterface:Translation Binding={Binding ToolTip}}">
<ContentControl Template="{Binding Icon,Converter={StaticResource NameToResourceConverter}}"
Margin="5"
VerticalAlignment="Center"
HorizontalAlignment="Center" />
</Button>
</DataTemplate>
</views:ContextActionTemplateSelector.SimpleContextActionDataTemplate>
<!-- Multiple DataTemplates follow!-->
为什么DataTemplate
/ ItemTemplteSelector
无法正常工作。虽然XAML中的硬编码按钮工作正常吗?
我上传了一个完整的示例,说明了哪些内容不起作用here:
只需调整窗口大小,然后尝试从OverflowPanel
中的按钮调用一个窗口。当'ICommand'正确执行时,Popup保持打开状态。
答案 0 :(得分:1)
在.NET framework source中,您可以找到处理OverflowPanel
类ToolBar
的结束行为的方法:
private static void _OnClick(object e, RoutedEventArgs args)
{
ToolBar toolBar = (ToolBar)e;
ButtonBase bb = args.OriginalSource as ButtonBase;
if (toolBar.IsOverflowOpen && bb != null && bb.Parent == toolBar)
toolBar.Close();
}
定义DataTemplate
并使用ItemsSource
属性时,创建按钮的Parent
属性变为null,if检查失败。这是DataTemplate
的预期行为,如here所述:
对于模板,模板的Parent最终将为null。要超越这一点并扩展到实际应用模板的逻辑树,请使用TemplatedParent。
作为解决方案,您可以在单击任何按钮时将IsOverflowOpen
属性设置为false:
<ToolBar Name="SomeToolBar" ItemsSource="{Binding Items}">
<ToolBar.ItemTemplate>
<DataTemplate DataType="local:ItemViewModel">
<Button Command="{Binding Command}" Content="{Binding Name}" Click="ButtonBase_OnClick"/>
</DataTemplate>
</ToolBar.ItemTemplate>
</ToolBar>
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
SomeToolBar.IsOverflowOpen = false;
}