2012-07-26 100 views
4

当我在WPF DataGrid中执行WPF MouseDoubleClick事件。当我双击一行时,应该执行对数据库的查询。只有DataGrid行被点击

这DataGrid中具有水平和垂直滚动条,我注意到,当我赶紧点击滚动条之一的箭头按钮,这将查询发送到数据库。

的问题是,我使用DataGrid的MouseDoubleClick事件,所以滚动条所属的DataGrid中,当他们双击,引发此事件。

有什么办法,只有当我在DataGrid上的一排双击,而不是当我在滚动条的一部分,双击执行双击事件?

回答

8

在你MouseDoubleClick事件试试这样做:

private void DataGridMouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    DependencyObject src = VisualTreeHelper.GetParent((DependencyObject)e.OriginalSource); 

    // Checks if the user double clicked on a row in the datagrid [ContentPresenter] 
    if (src.GetType() == typeof(ContentPresenter)) 
    { 
     // Your logic.. 
    } 
} 
+0

我认为这是行不通的。 DataGrid中有许多ContentPresenter(不仅用于行),并且您无法确定ContentPresenter是否是e.OriginalSource的直接父级。 – LPL 2012-07-27 09:18:12

+0

我以前用过这种方法。问题的关键是,如果e.OriginalSource的直接父是一个ContentPresenter你可以假设用户点击某行或该行的列的一个对象,因此你可以得到选定行。如果它是其他东西,比如边界或网格,就忽略它。你有任何可能出错的例子吗? – Eirik 2012-07-27 10:07:14

+0

我还没试过。这只是我的想法。我的意思是一个ContentPresenter不是一个行的迹象。这真的不会触发ColumnHeaders和ScrollBars?那么如果Template不是默认的呢? – LPL 2012-07-27 10:23:35

6

是,在RowStyle注册事件。

<DataGrid.RowStyle> 
    <Style TargetType="{x:Type DataGridRow}"> 
     <EventSetter Event="PreviewMouseDoubleClick" Handler="Row_PreviewMouseDoubleClick" /> 
    </Style> 
</DataGrid.RowStyle> 
+0

什么是在数据网格中添加eventsetter每一行的开销? – Mark 2012-07-26 22:48:24

+0

我觉得没什么可说的,因为对于所有行只有一个处理程序实例。 – LPL 2012-07-26 23:20:02

+0

干得好!效果很好,我看不到任何性能下降(关于Mark问的问题)。 – 2014-02-25 17:41:56