我从MenuItems
of 的命令传播中得到了奇怪的行为ContextMenu
。
我有以下类型的布局:ContextMenu
为每个inside设置,DataGridRow
而后者又位于AvalonDock 内部。如果我摆脱停靠或围绕我的网格,就没有问题。而不是也没有这个问题。DataGrid
UserControl
DockableContent
UserControl
ListBox
DataGrid
<Window x:Class="DockAndMenuTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ad="clr-namespace:AvalonDock;assembly=AvalonDock"
Title="MainWindow" Height="350" Width="525">
<ad:DockingManager>
<ad:DocumentPane>
<ad:DockableContent Title="Doh!">
<UserControl>
<UserControl.CommandBindings>
<CommandBinding Command="Zoom"
Executed="ExecuteZoom"
CanExecute="CanZoom"/>
</UserControl.CommandBindings>
<DataGrid Name="_evilGrid">
<DataGrid.Resources>
<Style TargetType="DataGridRow">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Command="Zoom"/>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</DataGrid.Resources>
</DataGrid>
</UserControl>
</ad:DockableContent>
</ad:DocumentPane>
</ad:DockingManager>
</Window>
代码隐藏也很简单:
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
_evilGrid.ItemsSource =
new[]
{
Tuple.Create(1, 2, 3),
Tuple.Create(4, 4, 3),
Tuple.Create(6, 7, 1),
};
}
private void ExecuteZoom(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("zoom !");
}
private void CanZoom(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
}
所以这就是问题所在:右键单击选定的行(如果它在右键单击之前被选中)我的命令被禁用。在这种情况下,命令是“缩放”,但可以是任何其他命令,包括自定义命令。
我不知道这里有什么问题。SNOOP 表明,在此传播失败的情况下,由“PART_ShowContextMenuButton”(按钮)处理,而不是UserControl
,CanExecute
它是对接标头的一部分。
我UserControls
在 AvalonDock 内托管的 UI 命令传播方面遇到了其他问题,但这是最容易重现的问题。