public virtual void Drop(DropInfo dropInfo) { int insertIndex = dropInfo.InsertIndex; IList destinationList = DefaultDropHandler.GetList(dropInfo.TargetCollection); IEnumerable data = DefaultDropHandler.ExtractData(dropInfo.Data); if (dropInfo.DragInfo.VisualSource == dropInfo.VisualTarget) { IList sourceList = DefaultDropHandler.GetList(dropInfo.DragInfo.SourceCollection); foreach (object o in data) { int index = sourceList.IndexOf(o); if (index != -1) { sourceList.RemoveAt(index); if (sourceList == destinationList && index < insertIndex) { --insertIndex; } } } } foreach (object o in data) { destinationList.Insert(insertIndex++, o); } }
protected static bool TestCompatibleTypes(IEnumerable target, object data) { TypeFilter filter = (t, o) => { return(t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IEnumerable <>)); }; var enumerableInterfaces = target.GetType().FindInterfaces(filter, null); var enumerableTypes = from i in enumerableInterfaces select i.GetGenericArguments().Single(); if (enumerableTypes.Count() > 0) { Type dataType = TypeUtilities.GetCommonBaseClass(DefaultDropHandler.ExtractData(data)); return(enumerableTypes.Any(t => t.IsAssignableFrom(dataType))); } else { return(target is IList); } }