代码之家  ›  专栏  ›  技术社区  ›  Xavier Poinas

从Silverlight DataGrid中的索引获取行

  •  3
  • Xavier Poinas  · 技术社区  · 14 年前

    我正在尝试在Silverlight数据报中实现重新排序行。为此,我将延长默认值 DataGridDragDropTarget ,我需要重写并实现以下方法:

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

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

    2 回复  |  直到 14 年前
        1
  •  5
  •   Xavier Poinas    14 年前

    对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;
    }
    
        2
  •  3
  •   herzmeister    14 年前

    我没看过 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
        }
    }
    

    不过,我不知道您希望如何实现行的重新排序。很可能您必须自己跟踪索引,并在该方法中返回自己存储的索引值之一。