public virtual void OnDropCompleted(IDataObject obj, Point dropPoint) { var targetElement = TargetElement as FrameworkElement; if (targetElement == null) { return; } var targetListBox = targetElement.FindLogicalAncestorByType <ListBox>(); if (targetListBox == null) { return; } var targetGroup = SystemAssaultScreen.GetAssaultGroup(targetListBox); if (targetGroup == AssaultGroup.Invalid || targetGroup == AssaultGroup.Destroyed) { return; } ICommand dropCommand; List <CombatUnit> draggedUnits; if (!CanDrop(obj, out draggedUnits, out dropCommand)) { return; } if (!draggedUnits.All(o => dropCommand.CanExecute(o))) { return; } draggedUnits.ForEach(o => dropCommand.Execute(o)); }
private bool CanDrop(IDataObject obj, out List <CombatUnit> draggedUnits, out ICommand dropCommand) { dropCommand = null; draggedUnits = new List <CombatUnit>(); var targetElement = TargetElement as FrameworkElement; if (targetElement == null) { return(false); } var targetListBox = targetElement.FindLogicalAncestorByType <ListBox>(); if (targetListBox == null) { return(false); } var view = targetElement.FindLogicalAncestorByType <SystemAssaultScreen>(); if (view == null || view.Model == null) { return(false); } var sourceElement = ExtractElement(obj) as DependencyObject; if (sourceElement == null) { return(false); } var assaultGroup = SystemAssaultScreen.GetAssaultGroup(targetListBox); var sourceListBox = sourceElement as ListBox; if (sourceListBox == null) { sourceListBox = sourceElement.FindLogicalAncestorByType <ListBox>(); if (sourceListBox == null) { return(false); } draggedUnits.AddRange(sourceListBox.SelectedItems.OfType <CombatUnit>().Where(o => !o.IsDestroyed)); } else { var combatUnit = sourceElement.GetValue(FrameworkElement.DataContextProperty) as CombatUnit; if (combatUnit == null || combatUnit.IsDestroyed) { return(false); } draggedUnits.Add(combatUnit); } if (draggedUnits.Count == 0) { return(false); } switch (assaultGroup) { case AssaultGroup.Invalid: goto default; case AssaultGroup.Standby: dropCommand = view.Model.StandbyOrderCommand; break; case AssaultGroup.Attack: dropCommand = view.Model.AttackOrderCommand; break; case AssaultGroup.LandTroops: dropCommand = view.Model.LandTroopsOrderCommand; return(!draggedUnits.Select(o => o.Source).OfType <Ship>().Any(o => o.ShipType != ShipType.Transport)); case AssaultGroup.Destroyed: goto default; default: return(false); } return(true); }