GlobalVarEditorViewModel.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using Prism.Commands;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Collections.ObjectModel;
  5. using TeamAAS.Communication.Models;
  6. namespace TeamAAS.ViewModels
  7. {
  8. /// <summary>
  9. /// 全局变量编辑器 VM(可复用)。在独立工作集 <see cref="Items"/> 上增删改移,
  10. /// 与 live GlobalVariableManager.Variables 解耦——配合“克隆-编辑-提交”,取消可回滚。
  11. /// 调用方指定 Scope(新建变量盖此作用域)与初始项(通常为某作用域的克隆)。
  12. /// DataContext 供 GlobalVarEditorView 绑定。
  13. /// </summary>
  14. public class GlobalVarEditorViewModel : TeamAAS.BindableBase
  15. {
  16. /// <summary>工作集(克隆),编辑不直接影响 live 列表;由调用方在确定时提交。</summary>
  17. public ObservableCollection<GlobalVariableModel> Items { get; }
  18. = new ObservableCollection<GlobalVariableModel>();
  19. /// <summary>本编辑器管理的作用域;新建变量盖此 Scope。</summary>
  20. public VarScope Scope { get; }
  21. /// <summary>可选变量类型(供类型下拉)。</summary>
  22. public Array VarTypes => GlobalVariableTypes.AllTypes;
  23. private GlobalVariableModel _selected;
  24. public GlobalVariableModel Selected
  25. {
  26. get => _selected;
  27. set
  28. {
  29. if (SetProperty(ref _selected, value))
  30. {
  31. DeleteCommand?.RaiseCanExecuteChanged();
  32. MoveUpCommand?.RaiseCanExecuteChanged();
  33. MoveDownCommand?.RaiseCanExecuteChanged();
  34. }
  35. }
  36. }
  37. public bool HasSelected => _selected != null;
  38. public DelegateCommand<string> AddCommand { get; }
  39. public DelegateCommand DeleteCommand { get; }
  40. public DelegateCommand MoveUpCommand { get; }
  41. public DelegateCommand MoveDownCommand { get; }
  42. public GlobalVarEditorViewModel(VarScope scope, IEnumerable<GlobalVariableModel> initial)
  43. {
  44. Scope = scope;
  45. if (initial != null)
  46. foreach (var v in initial) Items.Add(v);
  47. Reindex();
  48. AddCommand = new DelegateCommand<string>(Add);
  49. DeleteCommand = new DelegateCommand(Delete, () => HasSelected);
  50. MoveUpCommand = new DelegateCommand(MoveUp, () => HasSelected);
  51. MoveDownCommand = new DelegateCommand(MoveDown, () => HasSelected);
  52. }
  53. private void Add(string dataType)
  54. {
  55. if (string.IsNullOrEmpty(dataType)) return;
  56. Items.Add(GlobalVariableModel.Create(dataType, Scope, Items.Count));
  57. }
  58. private void Delete()
  59. {
  60. if (_selected == null) return;
  61. Items.Remove(_selected);
  62. Selected = null;
  63. Reindex();
  64. }
  65. private void MoveUp()
  66. {
  67. if (_selected == null) return;
  68. int i = Items.IndexOf(_selected);
  69. if (i <= 0) return;
  70. Items.Move(i, i - 1);
  71. Reindex();
  72. }
  73. private void MoveDown()
  74. {
  75. if (_selected == null) return;
  76. int i = Items.IndexOf(_selected);
  77. if (i < 0 || i >= Items.Count - 1) return;
  78. Items.Move(i, i + 1);
  79. Reindex();
  80. }
  81. private void Reindex()
  82. {
  83. for (int i = 0; i < Items.Count; i++) Items[i].Index = i;
  84. }
  85. }
  86. }