我正在使用XamDataGrid v14.2,并希望添加在数据网格内拖放行的功能。
我已经浏览了Infragistics论坛的帖子,但是大多数代码示例显示了将行从一个网格拖放到另一个网格。
是否可以在同一网格内拖放行?我要实现的效果是移动Web公告行号的顺序。
以下是网格外观的图像:
答案 0 :(得分:0)
几个月前,我在Infragistics Forums上发布了具有某种行为的示例,该示例对与您的要求类似的行进行了重新排序。
相关标记:
<igDP:XamDataGrid DataSource="{Binding Items}" IsSynchronizedWithCurrentItem="True" GroupByAreaLocation="None">
<i:Interaction.Behaviors>
<DragGrid:XamDataGridDragDropBehavior/>
</i:Interaction.Behaviors>
</igDP:XamDataGrid>
行为的C#代码:
using System;
using System.Collections.Generic;
using Infragistics.Windows.DataPresenter;
using System.Windows.Interactivity;
using System.Windows;
using Infragistics.DragDrop;
using System.Windows.Input;
using Infragistics.Windows;
using System.Collections;
using System.Windows.Media;
using System.Reflection;
namespace DragGrid
{
public class XamDataGridDragDropBehavior : Behavior<DataPresenterBase>
{
private DataPresenterBase dataPresenter;
protected override void OnAttached()
{
base.OnAttached();
dataPresenter = this.AssociatedObject;
EventManager.RegisterClassHandler(typeof(XamDataGrid), UIElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler(XamDataGrid_MouseLeftButtonDown));
var dataPresenterStyle = new Style(typeof(DataRecordPresenter));
dataPresenterStyle.Setters.Add(new EventSetter(FrameworkElement.LoadedEvent, new RoutedEventHandler(OnRecordPresenterLoaded)));
dataPresenter.Resources.Add(typeof(DataRecordPresenter), dataPresenterStyle);
DropTarget dropTarget = new DropTarget() { IsDropTarget = true };
DragDropManager.SetDropTarget(dataPresenter, dropTarget);
}
private void OnRecordPresenterLoaded(object sender, RoutedEventArgs e)
{
var recordPresenter = sender as DataRecordPresenter;
if (DragDropManager.GetDragSource(recordPresenter) != null)
{
return;
}
var dragSource = new DragSource
{
IsDraggable = true
};
dragSource.DragStart += new System.EventHandler<DragDropStartEventArgs>(dragSource_DragStart);
dragSource.Drop += OnRecordDragDrop;
dragSource.DragTemplate = ((Window)Utilities.GetAncestorFromType(this.dataPresenter, typeof(Window), true)).Resources["dragTemplate"] as DataTemplate;
DragDropManager.SetDragSource(recordPresenter, dragSource);
}
void dragSource_DragStart(object sender, DragDropStartEventArgs e)
{
ArrayList draggedItems = new ArrayList();
List<IList> sourceList = new List<IList>();
SelectedRecordCollection selectedRecords = this.dataPresenter.SelectedItems.Records;
DataRecord lastSelectedDataRecord = null;
foreach (Record r in selectedRecords)
{
DataRecord dr = r as DataRecord;
if (dr != null)
{
lastSelectedDataRecord = dr;
draggedItems.Add(dr.DataItem);
sourceList.Add(GetSourceList(dr));
}
}
DraggingData data = new DraggingData();
data.Items = draggedItems;
data.Lists = sourceList;
if (lastSelectedDataRecord != null && lastSelectedDataRecord.ParentRecord != null)
{
data.SourceProperty = lastSelectedDataRecord.RecordManager.Field.Name;
}
e.Data = data;
}
private IList GetSourceList(DataRecord record)
{
IList retVal = null;
DataRecord parent = record.ParentDataRecord;
if (parent == null)
{
// There is no parent, use the grids list
retVal = this.dataPresenter.DataSource as IList;
}
else
{
object parentDataItem = parent.DataItem;
Type dataItemType = parentDataItem.GetType();
PropertyInfo listProperty = dataItemType.GetProperty(record.RecordManager.Field.Name);
retVal = listProperty.GetValue(parentDataItem, null) as IList;
}
return retVal;
}
private void OnRecordDragDrop(object sender, DropEventArgs dragInfo)
{
var result = VisualTreeHelper.HitTest(dragInfo.DropTarget, dragInfo.GetPosition(dragInfo.DropTarget));
var targetElement = Utilities.GetAncestorFromType(result.VisualHit, typeof(DataRecordPresenter), true) as DataRecordPresenter;
if (targetElement != null)
{
DataRecord targetRecord = targetElement.DataRecord;
IList targetList = GetSourceList(targetRecord);
object targetItem = targetRecord.DataItem;
Type targetType = targetItem.GetType();
DraggingData draggedData = dragInfo.Data as DraggingData;
if (draggedData != null)
{
IList itemsList = draggedData.Items;
object firstItem = itemsList[0];
IList<IList> listsList = draggedData.Lists;
if (!targetType.IsInstanceOfType(firstItem))
{
// the target type doesn't match the items we are dropping, get the child list from the parent if we have a property.
if (draggedData.SourceProperty != null)
{
PropertyInfo listProperty = targetType.GetProperty(draggedData.SourceProperty);
targetList = listProperty.GetValue(targetItem, null) as IList;
if (targetList != null)
{
for (int i = itemsList.Count - 1; i >= 0; i--)
{
object currentItem = itemsList[i];
int targetIndex = targetList.IndexOf(targetItem);
listsList[i].Remove(currentItem);
targetList.Add(currentItem);
}
}
}
else
{
MessageBox.Show("Can't drop here");
}
}
else
{
for (int i = itemsList.Count - 1; i >= 0; i--)
{
object currentItem = itemsList[i];
int targetIndex = targetList.IndexOf(targetItem);
listsList[i].Remove(currentItem);
targetList.Insert(targetIndex, currentItem);
}
}
}
}
}
void XamDataGrid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (this.dataPresenter.Equals(sender))
{
DataRecordPresenter drp = Utilities.GetAncestorFromType(e.OriginalSource as DependencyObject, typeof(DataRecordPresenter), true) as DataRecordPresenter;
if (drp != null)
{
// If we already have a selection then we don't want the Grids SelectionController to be called which will cause a capture of the mouse and prevent dragging.
if (drp.IsSelected)
{
e.Handled = true;
}
}
}
}
}
}