using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Windows; using MAX.Core.Logger; using Prism.Commands; using Prism.Mvvm; using Trade.Framework.Services; namespace Main.Test.ViewModels; internal class MainViewModel : BindableBase { private List data = DemoData.Create(10000); public List Data { get => data; private set => SetProperty(ref data, value); } private string actionMessage = "可右键查看详情、复制编码或切换状态;默认加载 10,000 行。"; public string ActionMessage { get => actionMessage; private set => SetProperty(ref actionMessage, value); } private ObservableCollection selectedItems = new(); public ObservableCollection SelectedItems { get => selectedItems; set { ArgumentNullException.ThrowIfNull(value); if (ReferenceEquals(selectedItems, value)) return; selectedItems.CollectionChanged -= SelectionChanged; SetProperty(ref selectedItems, value); selectedItems.CollectionChanged += SelectionChanged; RaisePropertyChanged(nameof(SelectedCount)); } } public int SelectedCount => SelectedItems.Count; public int NetworkImageSize { get; set; } public DelegateCommand DetailCommand { get; } public DelegateCommand ConfirmCommand { get; } public DelegateCommand CopyCodeCommand { get; } public MainViewModel(ILoggerFacade logger, UserManager userManager) { selectedItems.CollectionChanged += SelectionChanged; DetailCommand = new(item => { if (item != null) ActionMessage = $"详情:{item.Code} · {item.Name} · ¥{item.Value} · {item.Buyer} · {item.Status}"; }); ConfirmCommand = new(item => { if (item == null) return; item.Status = item.Status == "已确认" ? "待处理" : "已确认"; ActionMessage = $"已更新 {item.Code}:{item.Status}"; }); CopyCodeCommand = new(item => { if (item == null) return; try { Clipboard.SetText(item.Code.ToString()); ActionMessage = $"已复制编码 {item.Code}"; } catch (System.Runtime.InteropServices.ExternalException) { ActionMessage = "剪贴板正忙,请重试。"; } }); } private void SelectionChanged(object? sender, NotifyCollectionChangedEventArgs e) => RaisePropertyChanged(nameof(SelectedCount)); public async Task LoadAsync(int count) { if (count is < 1 or > 50000) throw new ArgumentOutOfRangeException(nameof(count)); var imageSize = NetworkImageSize; var rows = await Task.Run(() => DemoData.Create(count, imageSize)); SelectedItems.Clear(); Data = rows; ActionMessage = $"已加载 {count:N0} 行;" + (imageSize == 0 ? "本地缩略图。" : $"Picsum {imageSize}×{imageSize} 网络随机图,可见时加载。每次重新加载使用新种子。冷 / 热测试以当前页面已加载状态为准。"); } }