using Plane.Copters; using GalaSoft.MvvmLight; using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Plane.FormationCreator.Formation { public class CopterCollection : ObservableCollection { /// /// 实现排序插入 /// /// public int AddCopter(ICopter entityObject) { int _index = 0; if (this.Count == 0) { Add(entityObject); _index = 0; } else { bool isInsret = false; for (int i = 0; i < this.Count; i++) { if (String.Compare(this[i].Name, entityObject.Name, false) >= 0) { InsertItem(i, entityObject); isInsret = true; _index= i; break; } } if (!isInsret) { Add(entityObject); _index = this.Count()-1 ; } } return _index; } } public class CopterManager : ObservableObject { public CopterManager() { AppEx.Current.AppModeChanged += (sender, e) => { RaisePropertyChanged(nameof(Copters)); }; App.Current.Exit += (sender, e) => { Task.WhenAll(Copters.Select(c => c.DisconnectAsync())); }; } public CopterCollection Copters { get;} = new CopterCollection(); public ArrayList CopterStatus = new ArrayList(); //public ObservableCollection Copters //{ // get // { // switch (AppEx.Instance.CurrentMode) // { // case AppMode.ControllingCopters: // default: // return CoptersForControlling; // case AppMode.PreparedForRunningTasks: // case AppMode.ModifyingTask: // return CoptersForModifyingTask; // case AppMode.RunningTasks: // throw new NotImplementedException(); // } // } //} public IEnumerable SelectedCopters { get { return _selectedCoptersGetter().Cast(); } } /// /// 注意:为避免多线程操作出问题,每次使用此属性时都会新建一个 List! /// public IEnumerable AcceptingControlCopters { get { return SelectedCopters.ToList(); } } private Func _selectedCoptersGetter; private Action _selectCopterAction; public void SetSelectionDelegates(Func selectedCoptersGetter, Action selectCopterAction) { _selectedCoptersGetter = selectedCoptersGetter; _selectCopterAction = selectCopterAction; } public event EventHandler SelectedCoptersChanged; public void RaiseSelectedCoptersChanged(IEnumerable addedCopters, IEnumerable removedCopters) { SelectedCoptersChanged?.Invoke(this, new SelectedCoptersChangedEventArgs { AddedCopters = addedCopters, RemovedCopters = removedCopters }); } public void Select(ICopter copter) { _selectCopterAction(copter); } } public class SelectedCoptersChangedEventArgs : EventArgs { public IEnumerable AddedCopters { get; set; } public IEnumerable RemovedCopters { get; set; } } }