using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using GongSolutions.Wpf.DragDrop; namespace Dominion.NET_WPF.ViewModel { class CardListViewModel : IDropTarget { public ObservableCollection Cards { get; set; } public void ShowCards(IEnumerable cards, DominionBase.Piles.Visibility visibility) { Cards = new ObservableCollection(); foreach (DominionBase.Cards.Card card in cards) Cards.Add(new CardViewModel { CardName = card.Name, ICard = card, Visibility = visibility }); } public CardListViewModel() { Cards = new ObservableCollection(); } void IDropTarget.DragOver(DropInfo dropInfo) { CardViewModel sourceItem = dropInfo.Data as CardViewModel; CardViewModel targetItem = dropInfo.TargetItem as CardViewModel; if (sourceItem != null && (targetItem != null || dropInfo.TargetCollection != null)) { dropInfo.Effects = DragDropEffects.Move; dropInfo.DropTargetAdorner = DropTargetAdorners.Insert; } if (targetItem == null) { } } void IDropTarget.Drop(DropInfo dropInfo) { if (dropInfo.DragInfo == null) return; int insertIndex = dropInfo.InsertIndex; IList destinationList = GetList(dropInfo.TargetCollection); IEnumerable data = ExtractData(dropInfo.Data); ListBox lbSource = dropInfo.DragInfo.VisualSource as ListBox; ListBox lbTarget = dropInfo.VisualTarget as ListBox; if (lbSource != null && lbTarget != null && lbSource.DataContext.GetType() == lbTarget.DataContext.GetType()) { IList sourceList = 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 IEnumerable ExtractData(object data) { if (data is IEnumerable && !(data is string)) return (IEnumerable)data; else return Enumerable.Repeat(data, 1); } protected static IList GetList(IEnumerable enumerable) { if (enumerable is ICollectionView) return ((ICollectionView)enumerable).SourceCollection as IList; else return enumerable as IList; } } }