2012-07-26 95 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