using System; using System.Collections.ObjectModel; using System.Linq; using System.Windows; using System.Windows.Input; using UIShare.ViewModelBase; using ZLGUSBCANFD; namespace CANModule.ViewModels { public class SelectCanMessageViewModel : DialogViewModelBase { #region 属性 public DialogCloseListener RequestClose { get; set; } private ObservableCollection _ChannelList; public ObservableCollection ChannelList { get => _ChannelList; set => SetProperty(ref _ChannelList, value); } private ObservableCollection _messageList; public ObservableCollection MessageList { get => _messageList; set => SetProperty(ref _messageList, value); } private ObservableCollection _signalList; public ObservableCollection SignalList { get => _signalList; set => SetProperty(ref _signalList, value); } private string _title = "CollectCANSignalSetting"; public string Title { get => _title; set => SetProperty(ref _title, value); } private string _selectedMessage; public string SelectedMessage { get => _selectedMessage; set { if (SetProperty(ref _selectedMessage, value)) { // 健壮性检查:防范切换通道时清空选择引发的连锁 Bug if (!string.IsNullOrEmpty(value)) { // 使用 FirstOrDefault 代替 First,防止找不到匹配项时导致上位机崩溃 var targetMsg = ZLGDBCParser.MsgDatabase[MessageChannel] .FirstOrDefault(x => $"[0x{x.msg_id:X}]{x.msg_name}" == value); if (targetMsg != null && targetMsg.signal_Name != null) { SignalList = new ObservableCollection(targetMsg.signal_Name); } else { SignalList = new ObservableCollection(); } } else { SignalList = new ObservableCollection(); } } } } private string _selectedSignal; public string SelectedSignal { get => _selectedSignal; set => SetProperty(ref _selectedSignal, value); } private int _MessageChannel=-1; public int MessageChannel { get => _MessageChannel; set { if (_MessageChannel != value) { _MessageChannel = value; // 1. 先安全清空旧的选择项和信号列表,断开引用链 SelectedMessage = null; SelectedSignal = null; SignalList = new ObservableCollection(); // 2. 刷新当前通道的报文列表 if (ZLGDBCParser.MsgDatabase != null && ZLGDBCParser.MsgDatabase.Count > value) { MessageList = new ObservableCollection( ZLGDBCParser.MsgDatabase[value].Select(s => $"[0x{s.msg_id:X}]{s.msg_name}") ); } else { MessageList = new ObservableCollection(); } RaisePropertyChanged(); } } } #endregion #region 命令 public ICommand CloseCommand { get; set; } public ICommand GetSelectedMessageCommand { get; set; } public ICommand GetSelectedSignalCommand { get; set; } public ICommand LoadCommand { get; set; } #endregion public SelectCanMessageViewModel(IContainerProvider containerProvider) : base(containerProvider) { CloseCommand = new DelegateCommand(Close); GetSelectedMessageCommand = new DelegateCommand(GetSelectedMessage); GetSelectedSignalCommand = new DelegateCommand(GetSelectedSignal); LoadCommand = new DelegateCommand(Load); } #region 命令处理 private void Close() { RequestClose.Invoke(); } private void Load() { ChannelList = new ObservableCollection(Enumerable.Range(0, 4)); } private void GetSelectedSignal() { if (!string.IsNullOrEmpty(SelectedSignal)) { Application.Current.Dispatcher.Invoke(() => { Clipboard.SetDataObject(SelectedSignal); }); } } private void GetSelectedMessage() { // 修复原本误写为 SelectedSignal != null 的 Bug,并增加了边界防错 if (!string.IsNullOrEmpty(SelectedMessage) && SelectedMessage.Contains(']')) { Application.Current.Dispatcher.Invoke(() => { Clipboard.SetDataObject(SelectedMessage); //var parts = SelectedMessage.Split(']'); //if (parts.Length > 1) //{ // Clipboard.SetDataObject(parts[1]); // 复制纯报文名称(如:"EngineStatus") //} }); } } #endregion } }