如何在WPF DataGrid中处理单元格双击事件,相当于Windows DataGrid的事件?

13
如你所知,在Windows的C# GridView中,如果我们想要处理单元格的点击/双击事件,则会有像CellClick、CellDoubleClick等事件。

所以,我想在WPF DataGrid中做同样的事情。到目前为止,我已经搜索了很多,但是没有一个可行或有用的答案。其中一些人说要使用MouseDoubleClick事件,但是在这个事件中,我们需要检查每一行以及该行中的每个项,因此检查每个单元格的数据是耗费时间的,而时间在这里是最重要的。

我的DataGrid绑定到DataTable上,AutoGeneratedColumn为False。如果你的答案基于AutoGeneratedColumn=True,那么是不可能的。即使我按照数据更改单元格的风格,也没有改变AutoGeneratedColumn属性的方法。

一个单元格点击/双击事件应该像Windows Grid的事件一样快。如果可能的话,请告诉我如何做,如果不行,那么有什么替代方案?

请帮帮我.....

非常感谢....

4个回答

17

我知道现在才来可能有点晚,但这对其他人可能会有用。

在你的 MyView.xaml 中:

<DataGrid x:Name="MyDataGrid" ...>
    <DataGrid.Resources>
        <Style TargetType="{x:Type DataGridCell}">
            <EventSetter Event="MouseDoubleClick" Handler="DataGridCell_MouseDoubleClick"/>
        </Style>
    </DataGrid.Resources>

    <!-- TODO: The rest of your DataGrid -->
</DataGrid>

在你的 MyView.xaml.cs 中:

private void DataGridCell_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    var dataGridCellTarget = (DataGridCell)sender;
    // TODO: Your logic here
}

3
非常好的回答 - Michael_S_

5
另一种方法是定义一个 DataGridTemplateColumn,而不是使用预定义的列,如 DataGridCheckBoxColumnDataGridComboBoxColumn,然后为数据模板中定义的 UI 元素添加事件处理程序。

下面我为 TextBlock 单元格定义了一个 MouseDown 事件处理程序。

<DataGrid AutoGenerateColumns="False">
    <DataGrid.Columns>

        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock MouseDown="TextBlock_MouseDown"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

在代码后台文件中:
private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
    TextBlock block = sender as TextBlock;
    if (block != null)
    {
        // Some Logic
        // block.Text
    }
}

谢谢,但我不知道在哪里编写这段代码,因为除了连接数据库外,我的.cs文件中没有其他代码,并且我正在根据该位置的数据更改特定网格的样式,所以我不知道在哪里定义这段代码...即使我现在正在尝试.....感谢回复... - iVad
你需要在DataGrid.Columns部分添加代码。我已经更新了我的答案... - Anand Murali
你是如何在后台代码或XAML中生成DataGrid列的? - Anand Murali

3
我知道编写 WPF 有时很麻烦。在这里,您需要无论如何处理 MouseDoubleClick 事件。然后搜索源对象层次结构以找到 DataGridRow 并进行任何操作。
更新:示例代码
XAML
<dg:DataGrid MouseDoubleClick="OnDoubleClick" />

代码后台

private void OnDoubleClick(object sender, MouseButtonEventArgs e)
{
    DependencyObject source = (DependencyObject) e.OriginalSource;
    var row = GetDataGridRowObject(source);
    if (row == null)
    {
         return;
    }
    else
    {
        // Do whatever with it
    }
    e.Handled = true;
}

private DataGridRow GetDataGridRowObject(DependencyObject source)                               
{
    // Write your own code to recursively traverse up via the source
    // until you find a DataGridRow object. Otherwise return null.
}

}


0
我使用过类似这样的东西:
<DataGrid.InputBindings>
    <MouseBinding Gesture="LeftDoubleClick" Command="{Binding ShowOverlay}" CommandParameter="{Binding Parameter}" />
</DataGrid.InputBindings>

并在我的视图模型中处理我的命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接