using Prism.Commands; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using TeamAAS.Communication.Models; namespace TeamAAS.ViewModels { /// /// 全局变量编辑器 VM(可复用)。在独立工作集 上增删改移, /// 与 live GlobalVariableManager.Variables 解耦——配合“克隆-编辑-提交”,取消可回滚。 /// 调用方指定 Scope(新建变量盖此作用域)与初始项(通常为某作用域的克隆)。 /// DataContext 供 GlobalVarEditorView 绑定。 /// public class GlobalVarEditorViewModel : TeamAAS.BindableBase { /// 工作集(克隆),编辑不直接影响 live 列表;由调用方在确定时提交。 public ObservableCollection Items { get; } = new ObservableCollection(); /// 本编辑器管理的作用域;新建变量盖此 Scope。 public VarScope Scope { get; } /// 可选变量类型(供类型下拉)。 public Array VarTypes => GlobalVariableTypes.AllTypes; private GlobalVariableModel _selected; public GlobalVariableModel Selected { get => _selected; set { if (SetProperty(ref _selected, value)) { DeleteCommand?.RaiseCanExecuteChanged(); MoveUpCommand?.RaiseCanExecuteChanged(); MoveDownCommand?.RaiseCanExecuteChanged(); } } } public bool HasSelected => _selected != null; public DelegateCommand AddCommand { get; } public DelegateCommand DeleteCommand { get; } public DelegateCommand MoveUpCommand { get; } public DelegateCommand MoveDownCommand { get; } public GlobalVarEditorViewModel(VarScope scope, IEnumerable initial) { Scope = scope; if (initial != null) foreach (var v in initial) Items.Add(v); Reindex(); AddCommand = new DelegateCommand(Add); DeleteCommand = new DelegateCommand(Delete, () => HasSelected); MoveUpCommand = new DelegateCommand(MoveUp, () => HasSelected); MoveDownCommand = new DelegateCommand(MoveDown, () => HasSelected); } private void Add(string dataType) { if (string.IsNullOrEmpty(dataType)) return; Items.Add(GlobalVariableModel.Create(dataType, Scope, Items.Count)); } private void Delete() { if (_selected == null) return; Items.Remove(_selected); Selected = null; Reindex(); } private void MoveUp() { if (_selected == null) return; int i = Items.IndexOf(_selected); if (i <= 0) return; Items.Move(i, i - 1); Reindex(); } private void MoveDown() { if (_selected == null) return; int i = Items.IndexOf(_selected); if (i < 0 || i >= Items.Count - 1) return; Items.Move(i, i + 1); Reindex(); } private void Reindex() { for (int i = 0; i < Items.Count; i++) Items[i].Index = i; } } }