3

我想实现在Silverlight DataGrid中重新排序行。对于这个我延长了默认DataGridDragDropTarget,我需要重写和实现下面的方法:在Silverlight DataGrid中从索引获取行

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

} 

我怎样才能从DataGrid和指数DataGridRow?

回答

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; 
} 
+0

很高兴我能帮助你把你放在正确的轨道上。是的,我也在想虚拟化。 – herzmeister 2010-11-01 14:15:18

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 
    } 
} 

我不但是你想怎么实现行的重新排序知道。机会是你必须自己跟踪你的索引,并在该方法中返回你自己存储的索引值中的一个。

+1

此方法不是在基类中实现(只是返回null)。您的实施不会总是有效,因为这些项目可能不会以与存储在Children集合中的顺序相同的顺序显示,即。 Children中的索引可以不同于DataGrid中行的索引。当数据源在渲染行后或由于面板中的虚拟化而发生更改时,会发生这种情况。不过它的确让我走上了正轨,所以非常感谢。这些行公开了可用于选择正确的GetIndex()方法。 – 2010-10-31 23:10:43