导致自定义行模板中的行选择 - MS WPF DataGrid

时间:2010-01-05 21:04:12

标签: c# wpf datagrid wpfdatagrid

我有一个自定义行模板来显示一些数据,并且它的'模板中没有使用SelectiveScrollingGrid。我不介意处理外部元素上的事件,但我似乎无法弄清楚如何导致“选择”行为。通常我是通过在活动的DataGridCell上引发MouseLeftButtonDownEvent来引起它的,但是现在我实际上没有任何DataGridCell,我对如何仅访问DataGridRow来复制该行为感到有点困惑。

2 个答案:

答案 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();