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));
}
}
}