报文设置扩展

This commit is contained in:
hsc
2026-07-06 09:28:29 +08:00
parent 2820b2f300
commit 6c2b975999
12 changed files with 527 additions and 15 deletions

View File

@@ -0,0 +1,171 @@
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<int> _ChannelList;
public ObservableCollection<int> ChannelList
{
get => _ChannelList;
set => SetProperty(ref _ChannelList, value);
}
private ObservableCollection<string> _messageList;
public ObservableCollection<string> MessageList
{
get => _messageList;
set => SetProperty(ref _messageList, value);
}
private ObservableCollection<string> _signalList;
public ObservableCollection<string> 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<string>(targetMsg.signal_Name);
}
else
{
SignalList = new ObservableCollection<string>();
}
}
else
{
SignalList = new ObservableCollection<string>();
}
}
}
}
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<string>();
// 2. 刷新当前通道的报文列表
if (ZLGDBCParser.MsgDatabase != null && ZLGDBCParser.MsgDatabase.Count > value)
{
MessageList = new ObservableCollection<string>(
ZLGDBCParser.MsgDatabase[value].Select(s => $"[0x{s.msg_id:X}]{s.msg_name}")
);
}
else
{
MessageList = new ObservableCollection<string>();
}
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<int>(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
}
}