CAN作用域优化

This commit is contained in:
hsc
2026-07-06 11:37:09 +08:00
parent 6c2b975999
commit aec0044595
4 changed files with 95 additions and 57 deletions

View File

@@ -10,6 +10,10 @@ namespace CANModule.ViewModels
{
public class SelectCanMessageViewModel : DialogViewModelBase
{
#region
private ZLGCANFD? _canfd;
#endregion
#region
public DialogCloseListener RequestClose { get; set; }
@@ -49,20 +53,22 @@ namespace CANModule.ViewModels
{
if (SetProperty(ref _selectedMessage, value))
{
// 健壮性检查:防范切换通道时清空选择引发的连锁 Bug
if (!string.IsNullOrEmpty(value))
if (!string.IsNullOrEmpty(value) && _canfd != null)
{
// 使用 FirstOrDefault 代替 First防止找不到匹配项时导致上位机崩溃
var targetMsg = ZLGDBCParser.MsgDatabase[MessageChannel]
.FirstOrDefault(x => $"[0x{x.msg_id:X}]{x.msg_name}" == value);
var db = _canfd.DBCParser.MsgDatabase;
if (MessageChannel >= 0 && MessageChannel < db.Count)
{
var targetMsg = db[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>();
if (targetMsg != null && targetMsg.signal_Name != null)
{
SignalList = new ObservableCollection<string>(targetMsg.signal_Name);
}
else
{
SignalList = new ObservableCollection<string>();
}
}
}
else
@@ -80,7 +86,7 @@ namespace CANModule.ViewModels
set => SetProperty(ref _selectedSignal, value);
}
private int _MessageChannel=-1;
private int _MessageChannel = -1;
public int MessageChannel
{
get => _MessageChannel;
@@ -90,17 +96,25 @@ namespace CANModule.ViewModels
{
_MessageChannel = value;
// 1. 先安全清空旧的选择项和信号列表,断开引用链
// 1. 先安全清空旧的选择项和信号列表
SelectedMessage = null;
SelectedSignal = null;
SignalList = new ObservableCollection<string>();
// 2. 刷新当前通道的报文列表
if (ZLGDBCParser.MsgDatabase != null && ZLGDBCParser.MsgDatabase.Count > value)
if (_canfd != null)
{
MessageList = new ObservableCollection<string>(
ZLGDBCParser.MsgDatabase[value].Select(s => $"[0x{s.msg_id:X}]{s.msg_name}")
);
var db = _canfd.DBCParser.MsgDatabase;
if (db != null && value >= 0 && value < db.Count)
{
MessageList = new ObservableCollection<string>(
db[value].Select(s => $"[0x{s.msg_id:X}]{s.msg_name}")
);
}
else
{
MessageList = new ObservableCollection<string>();
}
}
else
{
@@ -128,6 +142,13 @@ namespace CANModule.ViewModels
LoadCommand = new DelegateCommand(Load);
}
#region Dialog
public override void OnDialogOpened(IDialogParameters parameters)
{
_canfd = parameters.GetValue<ZLGCANFD>("CANFD");
}
#endregion
#region
private void Close()
{
@@ -136,7 +157,8 @@ namespace CANModule.ViewModels
private void Load()
{
ChannelList = new ObservableCollection<int>(Enumerable.Range(0, 4));
int maxCh = _canfd?.DBCParser.MaxChannels ?? 4;
ChannelList = new ObservableCollection<int>(Enumerable.Range(0, maxCh));
}
private void GetSelectedSignal()
@@ -152,20 +174,14 @@ namespace CANModule.ViewModels
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
}
}
}