如何绑定命令以双击DataGrid中的行

时间:2011-04-27 18:14:32

标签: wpf datagrid icommand

我开发了一个WPF UserControl,旨在用作选择列表,如下所示:

  • 绑定到实体(例如员工)的CollectionView的DataGrid
  • DataGrid上方的TextBox,可用于过滤DataGrid中显示的项目。

我想公开一个Command,当用户双击DataGrid中的一行时将执行该命令。然后,容器可以通过对DataGrid中的SelectedItem执行某些操作来对此做出反应。

到目前为止,我已尝试按如下方式处理双击:

<DataGrid IsReadOnly="True">
    <DataGrid.InputBindings>
        <MouseBinding MouseAction="LeftDoubleClick" Command="... />
    </DataGrid.InputBindings>
...

但是,当用户单击DataGrid标头时,双击事件仍会触发。我希望能够限制它,以便只在双击位于DataGrid的主体中时才执行Command。有声明的方法吗?

更新

我刚刚掌握WPF和MVVM,我真的在寻找有关如何实现这种低级可重用组件的指导。任何一般性建议也将被感激地收到和投票。就目前而言,我假设我想要这个UserControl:

  • 公开绑定到DataGrid的SelectedItem的依赖属性“SelectedItem”

  • 公开当用户双击某一行时触发的RoutedEvent“ItemDoubleClick”或类似内容。

  • 实施ICommandSource并从行双击事件处理程序中调用CommandHelpers.ExecuteCommandSource(this)

2 个答案:

答案 0 :(得分:10)

如果背后的代码不是问题:

<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
        <EventSetter Event="Loaded" Handler="Row_Loaded"/>
    </Style>
</DataGrid.RowStyle>
private void Row_Loaded(object sender, RoutedEventArgs e)
{
    var row = sender as DataGridRow;
    row.InputBindings.Add(new MouseBinding(MyCommands.MyCommand,
            new MouseGesture() { MouseAction = MouseAction.LeftDoubleClick }));
}

答案 1 :(得分:1)

您可以简单地将DataGrid放入Grid中并在Grid中定义InputBindings。在canExecute-definition中,如果选择了行,则应检查。这也适用于KeyBinding,例如自定义Delete-Command。

<Grid>
        <Grid.InputBindings>
            <MouseBinding MouseAction="LeftDoubleClick" Command="... />
        </Grid.InputBindings>
        <DataGrid IsReadOnly="True">
        ...
</Grid>