Wonderware InTouch中ActiveX控件属性与标签无法双向绑定问题咨询
C# ActiveX控件与Wonderware InTouch标签双向绑定解决方案
你遇到的问题核心不是无法实现双向绑定,而是缺少属性变更通知机制——InTouch要主动读取控件属性值,需要控件在属性变化时主动通知COM容器(也就是InTouch),仅添加[Bindable(true)]这类特性不足以满足要求。
以下是具体的修正方案:
1. 实现COM兼容的属性变更通知
在C#开发ActiveX控件时,需通过INotifyPropertyChanged接口暴露属性变更事件(.NET的COM互操作会自动将这个接口转换为COM兼容的事件机制,供InTouch识别)。
2. 修改属性代码并添加事件触发
调整属性实现逻辑,确保:
- 用私有字段存储属性值,避免直接依赖控件内部元素的状态
- 在属性setter中检测值变化并触发变更事件
- 同步控件内部元素(如textBox1)的用户输入到属性,并触发通知
示例代码:
using System.ComponentModel; using System.Windows.Forms; public partial class YourActiveXControl : UserControl, INotifyPropertyChanged { // 实现属性变更事件 public event PropertyChangedEventHandler PropertyChanged; private void RaisePropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } private string _text1; // 配置属性特性,确保COM可见且可绑定 [Bindable(true)] [Browsable(true)] [Category("Data Binding")] [Description("支持双向绑定的文本属性")] public string Text1 { get => _text1; set { if (_text1 != value) { _text1 = value; textBox1.Text = value; // 通知容器属性已变更 RaisePropertyChanged(nameof(Text1)); } } } // 监听内部文本框的输入变化,同步到属性并触发通知 private void textBox1_TextChanged(object sender, EventArgs e) { if (_text1 != textBox1.Text) { _text1 = textBox1.Text; RaisePropertyChanged(nameof(Text1)); } } // 控件构造函数中绑定文本框事件 public YourActiveXControl() { InitializeComponent(); textBox1.TextChanged += textBox1_TextChanged; } }
3. 控件注册与InTouch配置注意事项
- 重新编译控件后,使用
regasm /codebase /tlb YourControl.dll重新注册,确保类型库(.tlb)正确生成并包含事件信息 - 在InTouch中关联标签时,确认标签的数据类型与控件属性类型匹配(比如都是字符串)
- 部分InTouch版本需要在标签绑定设置中明确启用“读取属性”选项(可参考InTouch的ActiveX绑定配置界面)
完成上述步骤后,即可实现ActiveX控件属性与InTouch标签的双向绑定:标签可以设置控件属性,控件属性变化时也能同步更新到标签。
内容的提问来源于stack exchange,提问作者sdb
相关产品推荐
相关产品推荐

