using Prism.Commands; using Prism.Ioc; using System; using System.Collections.ObjectModel; using System.Windows.Input; using UIShare.PubEvent; using UIShare.UIViewModel; using UIShare.ViewModelBase; namespace DeviceEditModule.ViewModels { /// /// 弹窗管理器 ViewModel。 /// /// 职责:
/// 1. 订阅 ,将外部弹窗注册为 Tab;
/// 2. 维护 集合,控制选中/关闭逻辑;
/// 3. 最小化:通过 事件通知 View 执行 P/Invoke 窗口操作;
/// 4. 关闭:调用 。 ///
///
public class DialogMangerViewModel : DialogViewModelBase, IDisposable { #region 属性 /// 所有 Tab 项集合,绑定到标签条的 ItemsControl。 public ObservableCollection TagItems { get; } = new(); private DialogTabItemVM? _selectedTag; /// 当前激活的 Tab,其 Content 显示在内容区。 public DialogTabItemVM? SelectedTag { get => _selectedTag; set => SetProperty(ref _selectedTag, value); } /// 是否没有任何 Tab(用于绑定空状态提示的 Visibility)。 public bool HasNoTabs => TagItems.Count == 0; #endregion #region 命令 public ICommand MinimizeCommand { get; } public ICommand CloseCommand { get; } #endregion #region 事件 /// /// View 订阅此事件后,在事件回调里执行 P/Invoke 最小化。 /// 这样 ViewModel 无需引用任何 UI 或 Win32 类型。 /// public event EventHandler? MinimizeRequested; public event EventHandler? RestoreRequested; #endregion public DialogMangerViewModel(IContainerProvider containerProvider) : base(containerProvider) { MinimizeCommand = new DelegateCommand(OnMinimize); CloseCommand = new DelegateCommand(OnClose); // 订阅来自其他模块的"添加 Tab"事件 _eventAggregator.GetEvent().Subscribe(OnAddTab, ThreadOption.UIThread); _eventAggregator.GetEvent().Subscribe(()=>RestoreRequested.Invoke(this, EventArgs.Empty)); } #region 命令处理 private void OnMinimize() => MinimizeRequested?.Invoke(this, EventArgs.Empty); private void OnClose() { // 关闭前清空所有 Tab,释放内容引用 TagItems.Clear(); SelectedTag = null; RequestClose.Invoke(); } #endregion #region Tab 管理 /// 收到事件:创建 Tab 并追加到集合,自动切换选中。 private void OnAddTab(DialogTabInfo info) { var tab = new DialogTabItemVM(OnSelectTab, OnCloseTab) { Title = info.Title, Content = info.Content }; TagItems.Add(tab); RaisePropertyChanged(nameof(HasNoTabs)); ActivateTab(tab); } /// 激活(选中)指定 Tab,其余全部取消选中。 private void OnSelectTab(DialogTabItemVM tab) => ActivateTab(tab); /// 关闭指定 Tab,自动选中相邻 Tab(或清空内容区)。 private void OnCloseTab(DialogTabItemVM tab) { int idx = TagItems.IndexOf(tab); TagItems.Remove(tab); RaisePropertyChanged(nameof(HasNoTabs)); if (TagItems.Count == 0) { SelectedTag = null; return; } // 优先选左侧邻 Tab,无左侧则选当前索引(已向左移一位) ActivateTab(TagItems[Math.Max(0, idx - 1)]); } private void ActivateTab(DialogTabItemVM tab) { foreach (var t in TagItems) t.IsSelected = false; tab.IsSelected = true; SelectedTag = tab; } #endregion public void Dispose() { _eventAggregator.GetEvent().Unsubscribe(OnAddTab); } } }