我在XAML的DataGrid中有一个列,如下所示:
<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);
}
这里的想法是,当您单击数据表中的图像图标时,它会抓取您单击的行的索引,找到关联的线程ID,并构建URL然后将您带到那里。
这一切都有效,除了DataGrid.SelectedItems实际上没有捕捉到点击的内容。它捕获了点击时选择的内容。
这意味着如果您点击一行,它总是会选择您之前点击的内容,而不是您实际点击的内容。如何制作它以便选择我刚刚点击的内容?似乎并不是一个明显的ClickedItem&#39;相当于&#39; SelectedItems&#39;
- 解 -
由于AnjumSKhan,我最终使用的完整解决方案看起来像这样(将变量&#39; dc&#39;移动到显式的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 :(得分:1)
你试过这个:
private void Post_MouseDown(object sender, MouseButtonEventArgs e)
{
var dc = (sender as Image).DataContext;
...
}
答案 1 :(得分:1)
处理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
}
}