WPF InputBindings DoubleClick не работает для шаблона DataGrid
На слегка доработанном DataGrid
шаблон (добавлена полоса прокрутки / просмотрщик) DoubleClick
InputBinding
действие мыши никогда не срабатывает. Как ни странно, оба 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;
}
}