我需要为数据网格中的单元格提供右键单击弹出上下文菜单支持。 如果您右键单击该项目,有些人可能知道Silverlight 4 DataGrid,那么您的选择不会更新您右键单击的任何内容。
相关的StackOverflow问题(Silverlight Datagrid select on right click)解决了大部分问题,因为它在使用右键单击时选择了正确的行。
我的问题是如何选择正确的列?
谢谢, Jaans
更新:我在DataGridColumn(和DataGridRow)类上发现了一个静态方法,它帮助我创建了一个解决方案。
答案 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;
}
}