【问题标题】:Get Row from Index in Silverlight DataGrid从 Silverlight DataGrid 中的索引获取行
【发布时间】:2011-04-28 22:45:12
【问题描述】:

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

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

}

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

【问题讨论】:

    标签: silverlight datagrid silverlight-4.0 silverlight-toolkit


    【解决方案1】:

    对 Herzmeister 的回答略有改进,见 cmets:

    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】:

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

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

    【讨论】:

    • 该方法在基类中没有实现(只返回null)。您的实现并不总是有效,因为这些项目可能不会以与存储在 Children 集合中的顺序相同的顺序出现在视觉上,即。 Children 中的索引可以不同于 DataGrid 中行的索引。如果在渲染行之后或由于面板中的虚拟化而更改了数据源,则会发生这种情况。然而,它确实让我走上了正轨,所以谢谢你。这些行公开了可用于选择正确的 GetIndex() 方法。
    猜你喜欢
    • 2016-03-28
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 2015-01-23
    • 2010-11-25
    相关资源
    最近更新 更多