我想实现在Silverlight DataGrid中重新排序行。对于这个我延长了默认DataGridDragDropTarget
,我需要重写和实现下面的方法:在Silverlight DataGrid中从索引获取行
protected override DataGridRow ContainerFromIndex(DataGrid itemsControl, int index)
{
}
我怎样才能从DataGrid和指数DataGridRow?
我想实现在Silverlight DataGrid中重新排序行。对于这个我延长了默认DataGridDragDropTarget
,我需要重写和实现下面的方法:在Silverlight DataGrid中从索引获取行
protected override DataGridRow ContainerFromIndex(DataGrid itemsControl, int index)
{
}
我怎样才能从DataGrid和指数DataGridRow?
上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;
}
我没有看过在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()方法。 – 2010-10-31 23:10:43
很高兴我能帮助你把你放在正确的轨道上。是的,我也在想虚拟化。 – herzmeister 2010-11-01 14:15:18