DataGrid не выполняет событие двойного щелчка по редактируемым ячейкам

#c# #wpf #datagrid

Вопрос:

Цель

Цель состоит в том, чтобы выполнить команду двойным щелчком мыши по выбранной строке.

Проблема

Когда я дважды щелкаю ячейку, она переходит в режим редактирования и не выполняет команду.

введите описание изображения здесь

Если я дважды щелкну по пустой ячейке справа от столбца Data — она выполнит команду.

Кроме того, если я настроюсь IsReadOnly true , это сработает.. это просто не работает с редактируемыми ячейками.

Вопрос

Почему событие двойного щелчка не работает с редактируемыми ячейками?

Код для воспроизведения проблемы

XAML

 <DataGrid ItemsSource="{Binding SampleModels}" SelectedItem="{Binding SelectedItem}" AutoGenerateColumns="True" >
    <DataGrid.InputBindings>
        <MouseBinding Gesture="LeftDoubleClick" Command="{Binding Command}" />
    </DataGrid.InputBindings>
</DataGrid>
 

Модель

 public class SampleModel
{
    public int Id { get; set; }
    public string Data { get; set; }
}
 

Модель представления

 public class SampleViewModel : BaseViewModel
{
    public ObservableCollection<SampleModel> SampleModels { get; set; }

    private SampleModel _selectedItem;

    public SampleModel SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            _selectedItem = value;
            OnPropertyChanged();
        }
    }

    private void LoadData()
    {
        if(SampleModels == null)
        {
            SampleModels = new ObservableCollection<SampleModel>();
        }
        SampleModels.Clear();

        SampleModels.Add(new SampleModel { Id = 1, Data = "Item 1" });
        SampleModels.Add(new SampleModel { Id = 2, Data = "Item 2" });
    }

    public ICommand Command { get; }
    private void TestMethod()
    {
        var a = SelectedItem;
    }


    public SampleViewModel()
    {
        LoadData();
        Command = new RelayCommand(param => TestMethod());
    }

}
 

Ответ №1:

Почему событие двойного щелчка не работает с редактируемыми ячейками?

Потому DataGrid что элемент управления обрабатывает двойной щелчок, входя в режим редактирования ячейки. Как еще вы могли бы отредактировать ячейку?

Вы можете обработать двойной щелчок в ячейках, используя прикрепленное поведение:

 public static class DoubleClickBehavior
{
    public static ICommand GetCommand(UIElement element) =>
        (ICommand)element.GetValue(CommandProperty);

    public static void SetCommand(UIElement element, ICommand value) =>
        element.SetValue(CommandProperty, value);

    public static readonly DependencyProperty CommandProperty =
        DependencyProperty.RegisterAttached(
        "Command",
        typeof(ICommand),
        typeof(DoubleClickBehavior),
        new UIPropertyMetadata(null, OnChanged));

    private static void OnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        UIElement element = (UIElement)d;
        if (e.NewValue is ICommand command)
        {
            element.PreviewMouseLeftButtonDown  = OnMouseLeftButtonDown;
        }
        else
        {
            element.PreviewMouseLeftButtonDown -= OnMouseLeftButtonDown;
        }
    }

    private static void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (e.ClickCount == 2)
        {
            UIElement element = (UIElement)sender;
            ICommand command = GetCommand(element);
            if (command != null)
                command.Execute(null);
        }
    }
}
 

Пример Использования:

 <DataGrid ItemsSource="{Binding SampleModels}" SelectedItem="{Binding SelectedItem}" AutoGenerateColumns="True" >
    <DataGrid.InputBindings>
        <MouseBinding Gesture="LeftDoubleClick" Command="{Binding Command}" />
    </DataGrid.InputBindings>
    <DataGrid.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="local:DoubleClickBehavior.Command"
                    Value="{Binding DataContext.Command,RelativeSource={RelativeSource AncestorType=DataGrid}}" />
        </Style>
    </DataGrid.CellStyle>
</DataGrid>