我的命令传播行为很奇怪
MenuItems
属于
ContextMenu
.
我有以下类型的布局:
上下文菜单
为每个设置
DataGridRow
属于
DataGrid
里面
UserControl
,它依次在里面
DockableContent
阿瓦隆克的如果我摆脱
任何一个
对接或
用户控制
在我的网格周围没有问题。
ListBox
而不是
数据网格
也没有这个问题。
<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显示,在这种传播失败的情况下,而不是
用户控制
,
CanExecute
由“part_ShowContextMenuButton”(按钮)处理,该按钮是停靠标题的一部分。
我对内部的UI命令传播还有其他问题
UserControls
托管在Avalondock中,但这是最容易复制的。