C#仿CANoe PANL面板设计完成(二)

发布于:2025-06-27 ⋅ 阅读:(10) ⋅ 点赞:(0)

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控件的双向绑定管理,支持按钮/文本框/下拉框/复选框等控件类型,通过字典维护绑定关系,在变量变化时触发控件更新,提供全局事件通知机制,包含调试日志记录,便于扩展消息变量等新类型绑定。


网站公告

今日签到

点亮在社区的每一天
去签到