Silverlight Datagrid右键单击选择行和列

时间:2011-11-21 04:55:45

标签: silverlight datagrid

我需要为数据网格中的单元格提供右键单击弹出上下文菜单支持。 如果您右键单击该项目,有些人可能知道Silverlight 4 DataGrid,那么您的选择不会更新您右键单击的任何内容。

相关的StackOverflow问题(Silverlight Datagrid select on right click)解决了大部分问题,因为它在使用右键单击时选择了正确的行。

我的问题是如何选择正确的列?

谢谢, Jaans


更新:我在DataGridColumn(和DataGridRow)类上发现了一个静态方法,它帮助我创建了一个解决方案。

1 个答案:

答案 0 :(得分:2)

不确定这是最好的解决方案,但到目前为止似乎有效。

这是一个通用的辅助方法:

private T GetParentFromVisualTree<T>( DependencyObject dependencyObject ) where T : DependencyObject
{
    // Iteratively traverse the visual tree
    while ( dependencyObject != null && !( dependencyObject is T ) )
        dependencyObject = VisualTreeHelper.GetParent( dependencyObject );

    if ( dependencyObject == null )
        return null;

    return dependencyObject as T;
}

然后我按照上面引用的其他StackOverflow问题在Row_MouseRightButonDown事件中使用它:

private void DataGrid_LoadingRow( object sender, DataGridRowEventArgs e )
{
    e.Row.MouseRightButtonDown += Row_MouseRightButtonDown;
}

private void DataGrid_UnloadingRow( object sender, DataGridRowEventArgs e )
{
    e.Row.MouseRightButtonDown -= Row_MouseRightButtonDown;
}

private void Row_MouseRightButtonDown( object sender, MouseButtonEventArgs e )
{
    var dataGridRow = sender as DataGridRow;
    if (dataGridRow == null)
        return;

    // Select the row
    DataGrid.SelectedItem = dataGridRow.DataContext;

    // Select the column
    var dataGridCell = GetParentFromVisualTree<DataGridCell>( e.OriginalSource as DependencyObject );
    if ( dataGridCell != null )
    {
        var dataGridColumn = DataGridColumn.GetColumnContainingElement( dataGridCell );
        DataGrid.CurrentColumn = dataGridColumn;
    }
}