如何单击“行”,而不是“WPF数据网格中选定的行”

时间:2017-02-20 03:47:16

标签: c# .net wpf xaml datagrid

我在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);
    }

2 个答案:

答案 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
        }
    }