#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>