我正在尝试在Silverlight DataGrid中实现行重排。为此,我正在扩展默认的DataGridDragDropTarget
,并需要覆盖并实现以下方法:
protected override DataGridRow ContainerFromIndex(DataGrid itemsControl, int index)
{
}
我怎样从DataGrid中获取DataGridRow和索引?
我正在尝试在Silverlight DataGrid中实现行重排。为此,我正在扩展默认的DataGridDragDropTarget
,并需要覆盖并实现以下方法:
protected override DataGridRow ContainerFromIndex(DataGrid itemsControl, int index)
{
}
我怎样从DataGrid中获取DataGridRow和索引?
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
}
}
不过我不知道你如何实现行的重新排序。很有可能你必须自己跟踪索引,并在该方法中返回自己存储的一个索引值。