using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Windows.Media; using Brush = System.Windows.Media.Brush; namespace DrillTools { /// /// 刀序重排确认窗口视图模型 /// public class ToolReorderConfirmationViewModel : INotifyPropertyChanged { private ObservableCollection _originalTools = new(); private ObservableCollection _reorderedTools = new(); /// /// 原始刀具列表 /// public ObservableCollection OriginalTools { get => _originalTools; set => SetProperty(ref _originalTools, value); } /// /// 重排后刀具列表 /// public ObservableCollection ReorderedTools { get => _reorderedTools; set => SetProperty(ref _reorderedTools, value); } /// /// 构造函数 /// public ToolReorderConfirmationViewModel() { } /// /// 使用原始和重排后的刀具列表初始化 /// /// 原始刀具列表 /// 重排后刀具列表 public ToolReorderConfirmationViewModel(IEnumerable originalTools, IEnumerable reorderedTools) : this() { LoadTools(originalTools, reorderedTools); } /// /// 加载刀具数据 /// /// 原始刀具列表 /// 重排后刀具列表 public void LoadTools(IEnumerable originalTools, IEnumerable reorderedTools) { OriginalTools.Clear(); ReorderedTools.Clear(); // 创建原始刀具列表项 int order = 1; foreach (var tool in originalTools) { OriginalTools.Add(new ToolOrderItem { Order = order++, ToolNumber = tool.ToolNumber, Diameter = tool.Diameter, ToolTypeDisplay = tool.ToolTypeDisplay, BackgroundColor = System.Windows.Media.Brushes.White }); } // 创建重排后刀具列表项,并比较位置变化 order = 1; var originalToolList = originalTools.ToList(); var reorderedToolList = reorderedTools.ToList(); foreach (var tool in reorderedToolList) { // 查找该刀具在原始列表中的位置 int originalIndex = originalToolList.FindIndex(t => t.Diameter == tool.Diameter && t.ToolType == tool.ToolType); int newIndex = reorderedToolList.IndexOf(tool); // 判断位置是否发生变化 bool positionChanged = originalIndex != newIndex; ReorderedTools.Add(new ToolOrderItem { Order = order++, ToolNumber = tool.ToolNumber, Diameter = tool.Diameter, ToolTypeDisplay = tool.ToolTypeDisplay, BackgroundColor = positionChanged ? new SolidColorBrush(System.Windows.Media.Color.FromRgb(255, 235, 238)) : new SolidColorBrush(System.Windows.Media.Color.FromRgb(232, 245, 233)) }); // 同时更新原始列表中对应项的背景色 if (originalIndex >= 0 && originalIndex < OriginalTools.Count) { OriginalTools[originalIndex].BackgroundColor = positionChanged ? new SolidColorBrush(System.Windows.Media.Color.FromRgb(255, 235, 238)) : new SolidColorBrush(System.Windows.Media.Color.FromRgb(232, 245, 233)); } } } public event PropertyChangedEventHandler? PropertyChanged; protected bool SetProperty(ref T field, T value, [CallerMemberName] string? propertyName = null) { if (EqualityComparer.Default.Equals(field, value)) return false; field = value; OnPropertyChanged(propertyName); return true; } protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } /// /// 刀具排序项 /// public class ToolOrderItem : INotifyPropertyChanged { private int _order; private int _toolNumber; private double _diameter; private string _toolTypeDisplay = string.Empty; private Brush _backgroundColor = System.Windows.Media.Brushes.White; /// /// 序号 /// public int Order { get => _order; set => SetProperty(ref _order, value); } /// /// 刀具编号 /// public int ToolNumber { get => _toolNumber; set => SetProperty(ref _toolNumber, value); } /// /// 孔径 /// public double Diameter { get => _diameter; set => SetProperty(ref _diameter, value); } /// /// 刀具类型显示文本 /// public string ToolTypeDisplay { get => _toolTypeDisplay; set => SetProperty(ref _toolTypeDisplay, value); } /// /// 背景色 /// public Brush BackgroundColor { get => _backgroundColor; set => SetProperty(ref _backgroundColor, value); } public event PropertyChangedEventHandler? PropertyChanged; protected bool SetProperty(ref T field, T value, [CallerMemberName] string? propertyName = null) { if (EqualityComparer.Default.Equals(field, value)) return false; field = value; OnPropertyChanged(propertyName); return true; } protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }