从Silverlight DataGrid中的索引获取行

时间:2010-10-22 02:05:11

标签: silverlight datagrid silverlight-4.0 silverlight-toolkit

我正在尝试在Silverlight DataGrid中实现重新排序行。为此,我将扩展默认的DataGridDragDropTarget,我需要覆盖并实现以下方法:

protected override DataGridRow ContainerFromIndex(DataGrid itemsControl, int index)
{

}

如何从DataGrid和索引中获取DataGridRow?

2 个答案:

答案 0 :(得分:5)

Herzmeister的答案略有改善,见评论:

protected override DataGridRow ContainerFromIndex(DataGrid itemsControl, int index)
{
    var rowsPresenter = itemsControl.GetVisualDescendants().OfType<DataGridRowsPresenter>().FirstOrDefault();
    if (rowsPresenter != null)
    {
        return rowsPresenter.Children.OfType<DataGridRow>()
                .Where(row => row.GetIndex() == index).SingleOrDefault();
    }
    return null;
}

答案 1 :(得分:3)

我还没看过DataGridDragDropTarget,但你不能只做

protected override DataGridRow ContainerFromIndex(DataGrid itemsControl, int index)
{
    var row = base.ContainerFromIndex(itemsControl, index);
    if (row != null)
    {
        // do something with row
    }
}

如果由于某种原因没有实现,你可以试试这个:

// requires Assembly System.Windows.Controls.Toolkit.dll

using System.Windows.Controls.Primitives;
// ...

protected override DataGridRow ContainerFromIndex(DataGrid itemsControl, int index)
{
    var rowsPresenter =
        itemsControl.GetVisualDescendants()
            .OfType<DataGridRowsPresenter>().FirstOrDefault();
    if (rowsPresenter != null)
    {
        var row = rowsPresenter.Children[index];
        // do something with row
    }
}

但我不知道你想如何实现行的重新排序。您可能需要自己跟踪索引并在该方法中返回自己存储的索引值。