Я получаю странное поведение при распространении команд из MenuItems
из ContextMenu
.
У меня есть следующий вид макета: ContextMenu
установлен для каждого DataGridRow
из DataGrid
внутриUserControl
, который в свою очередь находится внутри DockableContent
AvalonDock.Если я избавлюсь от или стыковки или 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;
}
}
Так что вот в чем проблема: щелчок правой кнопкой мышив выбранной строке (если она была выбрана до щелчка правой кнопкой мыши) моя команда выходит отключенной.В данном случае это команда «Zoom», но может быть любой другой, включая пользовательскую.
Я не знаю, в чем здесь вина.SNOOP показывает, что в случаях, когда это распространение не удается, вместо UserControl
, CanExecute
обрабатывается "PART_ShowContextMenuButton" (Button), которая является частью заголовка стыковки.
У меня были другие проблемы с пользовательским интерфейсомРаспространение команд в UserControls
, размещенном внутри AvalonDock, но этот самый простой для воспроизведения.