Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
双击WPF中数据网格中的行_Wpf_Grid - Fatal编程技术网

双击WPF中数据网格中的行

双击WPF中数据网格中的行,wpf,grid,Wpf,Grid,我想在WPF中有一个函数:双击数据网格中的行将显示 窗口中的单元格。我怎么能做到呢?我是这样编程的,但我从来没有双击过。有人能帮我吗? 谢谢 只需创建自己的依赖项属性DataGridDoubleClickProperty,将DataGrid.MouseDoubleClick事件的处理程序附加到该属性 public static class Commands { public static readonly DependencyProperty DataGridDoubleClickPrope

我想在WPF中有一个函数:双击数据网格中的行将显示 窗口中的单元格。我怎么能做到呢?我是这样编程的,但我从来没有双击过。有人能帮我吗? 谢谢


只需创建自己的依赖项属性DataGridDoubleClickProperty,将DataGrid.MouseDoubleClick事件的处理程序附加到该属性

public static class Commands
{
  public static readonly DependencyProperty DataGridDoubleClickProperty =
    DependencyProperty.RegisterAttached("DataGridDoubleClickCommand", typeof ( ICommand ), typeof ( Commands ),
                      new PropertyMetadata(new PropertyChangedCallback(AttachOrRemoveDataGridDoubleClickEvent)));

  public static ICommand GetDataGridDoubleClickCommand(DependencyObject obj)
  {
    return (ICommand) obj.GetValue(DataGridDoubleClickProperty);
  }

  public static void SetDataGridDoubleClickCommand(DependencyObject obj, ICommand value)
  {
    obj.SetValue(DataGridDoubleClickProperty, value);
  }

  public static void AttachOrRemoveDataGridDoubleClickEvent(DependencyObject obj, DependencyPropertyChangedEventArgs args)
  {
    DataGrid dataGrid = obj as DataGrid;
    if ( dataGrid != null )
    {
      ICommand cmd = (ICommand) args.NewValue;

      if ( args.OldValue == null && args.NewValue != null )
      {
        dataGrid.MouseDoubleClick += ExecuteDataGridDoubleClick;
      }
      else if ( args.OldValue != null && args.NewValue == null )
      {
        dataGrid.MouseDoubleClick -= ExecuteDataGridDoubleClick;
      }
    }
  }

  private static void ExecuteDataGridDoubleClick(object sender, MouseButtonEventArgs args)
  {
    DependencyObject obj = sender as DependencyObject;
    ICommand cmd = (ICommand) obj.GetValue(DataGridDoubleClickProperty);
    if ( cmd != null )
    {
      if ( cmd.CanExecute(obj) )
      {
        cmd.Execute(obj);
      }
    }
  }

}
在您的视图中,可以使用绑定将此DependencyProperty映射到命令

<Grid DataContext="{StaticResource viewModel}">
  <DataGrid AutoGenerateColumns="True" 
        ItemsSource="{Binding Data}" 
        SelectedItem="{Binding SelectedItem}" 
        clr:Commands.DataGridDoubleClickCommand="{Binding DataGridDoubleClick}"
    />
</Grid>
DataGridDoubleClick是ViewModel类中的ICommand属性

例如,您的XAML可能如下所示:

<SomeControl  MouseDown="MyMouseDownHandler">
...
 </SomeControl>

您可以订阅PreviewMouseDoubleClick事件

<Style TargetType="DataGridRow">
    <EventSetter Event="PreviewMouseDoubleClick" Handler="OnDoubleClick"/>
</Style>

我猜您的处理程序不起作用,因为MouseDoubleClick事件是由DataGrid处理的。路由事件可以是从子级到父级的气泡,也可以是从父级到子级的隧道。任何预览事件都是隧道事件,允许您在DataGrid之前处理它。您可以添加您的C代码处理程序在哪里吗?@leoleo您可以添加您的C代码处理程序在哪里吗?
private void MyMouseDownHandler(object sender, MouseButtonEventArgs e)
{
    if (e.ClickCount == 2)
    {
        //Handle double-click
    }
}
<Style TargetType="DataGridRow">
    <EventSetter Event="PreviewMouseDoubleClick" Handler="OnDoubleClick"/>
</Style>
private void OnDoubleClick(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
    System.Diagnostics.Debug.WriteLine("DoubleClick!");
}