using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace UTS_Link_CANoe_Bridge.PANLEvent
{
public class BindingManager
{
private Dictionary<Control, IBinding> _bindings = new Dictionary<Control, IBinding>();
private Action<string, string, object> _globalVariableChangedHandler;
public void RegisterBinding(Control control, string namespacePath, string variableName, VariableType variableType = VariableType.SystemVariable)
{
COMInterop.InitApp();
if (control == null) throw new ArgumentNullException(nameof(control));
if (string.IsNullOrWhiteSpace(namespacePath)) throw new ArgumentNullException(nameof(namespacePath));
if (string.IsNullOrWhiteSpace(variableName)) throw new ArgumentNullException(nameof(variableName));
if (_bindings.ContainsKey(control))
{
LogDebug($"控件 {control.Name} 已绑定,跳过");
return;
}
CANoe.Variable variable = null;
// 根据变量类型获取变量对象
switch (variableType)
{
case VariableType.SystemVariable:
variable = COMInterop.GetVariables(namespacePath, variableName);
break;
case VariableType.MessageVariable:
// TODO: 这里调用获取报文变量的接口,示例:
// variable = COMInterop.GetMessageVariable(namespacePath, variableName);
break;
default:
LogError($"未知变量类型 {variableType}");
break;
}
IBinding binding = null;
if (control is Button btn)
binding = new ButtonVariableBinding(btn, namespacePath, variableName, variableType,this);
else if (control is TextBox tb)
binding = new TextBoxVariableBinding(tb, namespacePath, variableName, variableType, this);
else if (control is ComboBox cb)
binding = new ComboBoxVariableBinding(cb, namespacePath, variableName, variableType, this);
else if (control is CheckBox ck)
binding = new CheckBoxVariableBinding(ck, namespacePath, variableName, variableType, this);
else
{
LogError($"不支持的控件类型 {control.GetType().Name}");
return;
}
_bindings[control] = binding;
binding.Initialize();
LogDebug($"控件 {control.Name} 绑定成功,变量 {namespacePath}::{variableName} 类型 {variableType}");
}
public void SetGlobalVariableChangedHandler(Action<string, string, object> handler)
{
_globalVariableChangedHandler = handler;
}
internal void NotifyVariableChanged(string namespacePath, string variableName, object value)
{
foreach (var b in _bindings.Values)
{
if (b.NamespacePath == namespacePath && b.VariableName == variableName)
{
b.UpdateControl(value);
}
}
_globalVariableChangedHandler?.Invoke(namespacePath, variableName, value);
}
internal void LogDebug(string msg) => CommonLog.LogStaticForm.DEBUG_Log($"[Binding] {msg}");
internal void LogError(string msg) => CommonLog.LogStaticForm.ERROR_Log($"[Binding] {msg}");
}
}
BindingManager类实现CANoe变量与WinForms控件的双向绑定管理,支持按钮/文本框/下拉框/复选框等控件类型,通过字典维护绑定关系,在变量变化时触发控件更新,提供全局事件通知机制,包含调试日志记录,便于扩展消息变量等新类型绑定。