WPF InputBindings DoubleClick не работает для шаблона DataGrid

На слегка доработанном DataGrid шаблон (добавлена ​​полоса прокрутки / просмотрщик) DoubleClickInputBinding действие мыши никогда не срабатывает. Как ни странно, оба KeyBinding с и MouseBinding с одним щелчком мыши работают без проблем - кажется, он сломан только для всех привязок двойного щелчка.
Почему это происходит и как исправить InputBindings для следования DataGrid шаблон?

<ControlTemplate x:Key="AlwaysOnHeaderDataGridControlTemplate" TargetType="{x:Type DataGrid}">
   <Grid>
      <Grid.ColumnDefinitions>
         <ColumnDefinition/>
         <ColumnDefinition Width="Auto"/>
      </Grid.ColumnDefinitions>
      <ScrollBar x:Name="DG_AS" Grid.Column="1" Orientation="Vertical" 
                               Maximum="{Binding ScrollableHeight, ElementName=DG_ScrollViewer}"
                               Value="{Binding VerticalOffset, Mode=OneWay, ElementName=DG_ScrollViewer}"
                               Visibility="{Binding ComputedVerticalScrollBarVisibility, ElementName=DG_ScrollViewer}" 
                               ViewportSize="{Binding ViewportHeight, ElementName=DG_ScrollViewer}"/>
      <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled">
         <!--content of original DG template-->
      </ScrollViewer>
   </Grid>
</ControlTemplate>

<DataGrid IsReadOnly="True" Template="{DynamicResource AlwaysOnHeaderDataGridControlTemplate}">
   <DataGrid.InputBindings>
      <MouseBinding MouseAction="RightClick" Command="{Binding EditItem}"/><!--single clicks work-->
      <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding EditItem}"/><!--but double ones do not-->
   </DataGrid.InputBindings>
</DataGrid>

Примечание: шаблон пытается адресовать общеизвестный DataGrid ошибка, к сожалению принятый ответ нарушает вертикальную прокрутку, отсюда и вертикальную полосу прокрутки в шаблоне.



Включая минималистский пример кода ctrl+c&ctrl+v для воспроизведения ниже (щелкните правой кнопкой мыши DataGrid в Blend -> Edit Template/Edit a Copy..., чтобы получить шаблон DG по умолчанию).
Resoruces: см. Основную часть вопроса выше.
Элемент управления DataGrid:

<DataGrid IsReadOnly="True" Template="{DynamicResource AlwaysOnHeaderDataGridControlTemplate}" ItemsSource="{Binding Items}">
    <DataGrid.InputBindings>
        <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding EditItem}"/>
        <MouseBinding MouseAction="RightClick" Command="{Binding EditItem}"/>
        <KeyBinding Key="Delete"  Command="{Binding EditItem}"/>
    </DataGrid.InputBindings>
    <DataGrid.Columns>
        <DataGridTextColumn Width="100" Header="Item1" Binding="{Binding Item1}" />
        <DataGridTextColumn Width="100" Header="Item2" Binding="{Binding Item2}" />
        <DataGridTextColumn Width="100" Header="Item3" Binding="{Binding Item3}" />
        <DataGridTextColumn Width="100" Header="Item1" Binding="{Binding Item1}" />
    </DataGrid.Columns>
</DataGrid>

Codebehind:

public partial class MainWindow : Window
{
    public class EditCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;
        public bool CanExecute(object parameter) => true;
        public void Execute(object parameter) => MessageBox.Show("editing");//real command opens item detail control
    }

    private EditCommand _editItem;
    public EditCommand EditItem
    {
        get { return _editItem ?? (_editItem = new EditCommand()); }
    }

    public class Item
    {
        public string Item1 {get; set; }
        public string Item2 { get; set; }
        public string Item3 { get; set; }
    }

    public List<Item> Items
    {
        get
        {
            return new List<Item>
            {
                new Item { Item1 = "row1", Item2 =  "col2", Item3 = "col3" },
                new Item { Item1 = "row2", Item2 =  "col2", Item3 = "col3" },
                new Item { Item1 = "row3", Item2 =  "col2", Item3 = "col3" },
                new Item { Item1 = "row4", Item2 =  "col2", Item3 = "col3" },
                new Item { Item1 = "row5", Item2 =  "col2", Item3 = "col3" },
            };
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
    }
}

0 ответов

Другие вопросы по тегам