WPF DataGrid:CommandBinding为双击而不是使用事件

m-y*_*m-y 30 wpf datagrid double-click commandbinding

我知道如何在我的DataGrid中使用MouseDoubleClick事件来获取selectedvalue,但是如何使用命令绑定呢?这样我的ViewModel就可以处理逻辑.

到目前为止,我有以下内容:

<DataGrid Name="TestGrid" Grid.Row="2" Grid.ColumnSpan="2" AutoGenerateColumns="True" MouseDoubleClick="TestGrid_MouseDoubleClick"
          ItemsSource="{Binding Registrations}" SelectedValue="{Binding CurrentRegistration}" IsReadOnly="True" AlternationCount="2" GridLinesVisibility="None">
Run Code Online (Sandbox Code Playgroud)

我想摆脱MouseDoubleClick并适当地替换它.

Miz*_*zor 69

这里不需要附加行为或自定义DataGrid子类.

在你的DataGrid,绑定ItemsSourceICollectionView.这里的技巧是设置IsSynchronizedWithCurrentItem="True"哪个选定的行将是当前项.

第二部分技巧是CommandParameter使用正斜杠语法绑定到当前项.

双击一行时,将以单击的行作为参数执行该命令.

<DataGrid
    ItemsSource="{Binding CollectionView}"
    IsSynchronizedWithCurrentItem="True">
    <DataGrid.InputBindings>
        <MouseBinding
            MouseAction="LeftDoubleClick"
            Command="{Binding DoubleClickCommand}"
            CommandParameter="{Binding CollectionView/}"/>
    </DataGrid.InputBindings>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

这是视图模型的(简化)版本的外观:

class MyViewModel
{
    public ICollectionView CollectionView { get; set; }

    public ICommand DoubleClickCommand { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,这使它绑定到当前项目.与`IsSynchronizedWithCurrentItem`一起使用时,表示所选项目.[这里](http://www.thejoyofcode.com/binding_to_the_current_item_in_wpf.aspx)一篇博文. (6认同)
  • 非常简洁的解决方案。也不知道正斜杠绑定。有时我真的很惊讶人们从哪里知道这种事情。谢谢! (3认同)
  • 你的 `{Binding CollectionView/}` 中的 `/` 是故意的吗? (2认同)
  • 这是一个很好的解决方案。但是这里有一个缺点。如果双击 DataGrids 的标题,则无论如何都会执行该命令。在某些情况下,这对开发人员来说可能是不受欢迎的。那怎么解决呢? (2认同)
  • 注意,如果`IsReadOnly="False"` 为你的DataGrid,那么第一次点击可能会窃取选择机制。设置`IsReadOnly="True"` 来解决这个问题。 (2认同)

Tam*_*hen 23

另一种解决方案是添加输入绑定,并将selectedItem绑定到属性,以便您知道选择了哪一个:

<DataGrid SelectedItem="{Binding SelectedItem}">
      <DataGrid.InputBindings>
          <MouseBinding Gesture="LeftDoubleClick" Command="{Binding SomeCommand}"/>
     </DataGrid.InputBindings>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

  • 不错,但有一个问题。假设您有一个包含多列的数据网格,并且最后一列未设置为 width=* 并且您在最后一列之后的额外空间中双击最右侧,所选项目将不会更新,并且它将传递之前所选项目的任何内容。如果尚不存在选定的项目,它将传递 null。 (4认同)