我有一个自定义行模板来显示一些数据,并且它的'模板中没有使用SelectiveScrollingGrid。我不介意处理外部元素上的事件,但我似乎无法弄清楚如何导致“选择”行为。通常我是通过在活动的DataGridCell上引发MouseLeftButtonDownEvent来引起它的,但是现在我实际上没有任何DataGridCell,我对如何仅访问DataGridRow来复制该行为感到有点困惑。
答案 0 :(得分:2)
不确定你的模板是怎样的,但我想你可以考虑通过设置它的属性SelectionUnit =“FullRow”并执行下面的代码来选择网格的整行;它选择索引为3的整行。
int index = 3;
dataGrid.SelectedItem = dataGrid.Items[index];
dataGrid.ScrollIntoView(dataGrid.Items[index]);
DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromItem(dataGrid.Items[index]);
row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
如果您仍想选择一个单元格,请检查下面的代码是否适合您,它会为索引为3的行选择索引为2的单元格
int index = 3;
dataGrid.ScrollIntoView(dataGrid.Items[index]);
DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromItem(dataGrid.Items[index]);
if (row != null)
{
DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);
DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(2);
if (cell != null)
{
cell.IsSelected = true;
cell.Focus();
}
}
GetVisualChild程序实现:
static T GetVisualChild<T>(Visual parent) where T : Visual
{
T child = default(T);
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
child = v as T;
if (child == null)
{
child = GetVisualChild<T>(v);
}
if (child != null)
{
break;
}
}
return child;
}
希望这有帮助,尊重
答案 1 :(得分:0)
这就是我最终开始工作的原因,这很丑陋,但却完成了工作。这些元素只在左键或右键点击时突出显示,所以我不得不强制重绘,对我来说似乎很难看,但它有效。
var row = (DataGridRow)((FrameworkElement)sender).TemplatedParent;
var element = (FrameworkElement)sender;
var parentGrid = this.GetGridFromRow((DataGridRow)element.TemplatedParent);
parentGrid.SelectedItems.Clear();
row.IsSelected = true;
element.InvalidateVisual();
parentGrid.UpdateLayout();