2017-02-20 17 views
0

У меня есть столбец в DataGrid в XAML, который выглядит следующим образом:Как я могу получить ряд Нажал на, а не ряд выбранного в данной WPF сетка

<DataGridTemplateColumn Header="" Width="35" IsReadOnly="True"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Image Source="{Binding PostIcon}" Stretch="None" MouseDown="Post_MouseDown" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

Событие, которое выстреливает предполагается захватить другой фрагмент данных в строке datagrid: в этом случае код URL. Затем он проходит это, когда событие вызывается:

private void Post_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     int index = ThreadList.SelectedIndex; 
     DataRowView row = (DataRowView)ThreadList.SelectedItems[0]; 

     string topicID = Convert.ToString(row["URL"]); 
     string thisURL = "http://www.myforums.com/perm/topic/" + topicID; 

     System.Diagnostics.Process.Start(thisURL); 
    } 

Идея заключается в том, что при нажатии на иконку с изображением в таблице данных, она захватывает индекс строки, вы щелкнули, находит соответствующий идентификатор потока , и выстраивает URL-адрес, а затем отправляет вас туда.

Это все работает, за исключением того, что DataGrid.SelectedItems на самом деле не захватывает то, что нажал. Он фиксирует, что выбрано во время клика.

Это означает, что если вы нажмете на строку, она всегда будет выбирать то, что вы ранее нажали, а не то, что вы на самом деле просто нажали. Как сделать так, чтобы он выбирал, на что я только что нажал? Там, кажется, не быть очевидным эквивалентом «ClickedItem» к «» SelectedItems

--SOLUTION--

полное решение, которое я в конечном итоге использования, благодаря AnjumSKhan, выглядит следующим образом (показывая перемещение переменная 'DC' в явной переменной DataRowView):

private void Post_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     int index = ThreadList.SelectedIndex; 

     var dc = (sender as Image).DataContext; 

     DataRowView row = (DataRowView)dc; 

     string topicID = Convert.ToString(row["URL"]); 
     string thisURL = "http://www.myforums.com/perm/topic/" + topicID; 
     System.Diagnostics.Process.Start(thisURL); 
    } 
+0

«это всегда заканчивается выбор, что вы ранее выбрали, не то, что вы на самом деле просто щелкнули. », что вы подразумеваете под этим? – AnjumSKhan

+0

Что такое« selected »и« clicked »- это две разные вещи в WPF DataGrid. Поведение заканчивается тем, что вы можете« выбрать »строку 3, щелкнув левой кнопкой мыши по ней, а затем нажмите элемент в строке 1. Результат будет заключаться в том, что любое событие onclick будет срабатывать, когда вы нажмете на элемент Row 1, но когда код посмотрит на то, что на самом деле «выбрано», оно вернет результаты из строки 3. – mkautzm

ответ

1

вы пробовали это:

private void Post_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     var dc = (sender as Image).DataContext; 
     ... 
    } 
1

Han DLE MouseLeftButtonUp события и попробовать это:

private void DataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     DependencyObject dep = (DependencyObject)e.OriginalSource; 
     while ((dep != null) && !(dep is DataGridRow)) 
     { 
      dep = VisualTreeHelper.GetParent(dep); 
     } 

     if (dep is DataGridRow) 
     { 
      DataGridRow row = dep as DataGridRow; 
      // do something 
     } 
    }