我想實現在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