[开源]FreeSCADA的通道数据与控件属性关联以及自动刷新机制研究

【参考文章】:

1. WPF之Binding深入探讨, 地址:http://www.cnblogs.com/cappuccino/p/3251631.html

1. 几个重要的类列表:

a) Designer工程下的CommonBindingDialog.cs:

b) Designer工程下的NumericBindingPanel.cs(或者StringBindingPanel.cs):

c) CommonGUI工程下的SchemaDocument.cs(LoadSchema()和SaveSchema())和RunTime工程下的ShemaView.cs(LoadDocument()):

分别实现WPF界面的XMAL文件方式存储和XMAL文件方式载入,和实现WinForm下的WPF界面的载入。

2. 通道数据与控件属性关联(以及自动刷新机制):

a) 通道数据与控件属性绑定:

CommonBindingDialog.cs中的事件响应方法(Create association按钮被按下):

private void CreateAssociationButton_Click(object sender, EventArgs e)
{SavePanelStateAndClose();if (propertyList.SelectedIndex >= 0 && bindingTypes.SelectedIndex >= 0){BaseBindingPanelFactory factory = (BaseBindingPanelFactory)bindingTypes.SelectedItem; // factory在这里执行过后,就是NumericBindingPanel.cs里定义的NumericBindingPanelFactory类型了bindingPanel = factory.CreateInstance(); // bindingPanel的具体类型是NumericBindingPanel还是StringBindingPanel,在这里得到了重新定义(不再是基类的BaseBindingPanel类型了)bindingPanel.Initialize(element, propertyList.SelectedItem as PropertyWrapper, null);bindingPanel.Parent = panel1;bindingPanel.Dock = DockStyle.Fill;CreateAssociationButton.Enabled = false;bindingTypes.Enabled = false;}
}

CommonBindingDialog.cs中的事件响应方法(Save按钮被按下):

private void saveButton_Click(object sender, EventArgs e)
{SavePanelStateAndClose();if (activeBindings.Count > 0){foreach (PropertyWrapper key in activeBindings.Keys){DependencyObject depObj;DependencyProperty depProp;System.Windows.Data.BindingBase binding = activeBindings[key];if (key.GetWpfObjects(out depObj, out depProp) && binding != null)BindingOperations.SetBinding(depObj, depProp, binding);}}DialogResult = DialogResult.OK;Close();
}

继续来看SavePanelStateAndClose方法的实现:

private void SavePanelStateAndClose()
{if (bindingPanel != null){BindingBase binding = bindingPanel.Save(); // 见NumericBindingPanel类的Save()定义if (binding != null)activeBindings[bindingPanel.Property] = binding; // activeBindings为Dictionary<PropertyWrapper, BindingBase>,bindingPanel.Property为PropertyWrapperbindingPanel.Dispose();bindingPanel = null;}
}

我们再继续深入NumericBindingPanel.cs里面定义的Save方法:

public override System.Windows.Data.BindingBase Save()
{if (channel != null){System.Windows.Data.Binding bind = new System.Windows.Data.Binding("Value");ChannelDataProvider cdp = new ChannelDataProvider();cdp.ChannelName = channel.PluginId + "." + channel.Name;bind.Source = cdp; // 绑定的源数据为通道数据bind.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;cdp.Refresh();ComposingConverter conv = new ComposingConverter();if (checkBox1.Checked){RangeConverter rc = new RangeConverter();rc.Min = Decimal.ToDouble(minEdit.Value);rc.Max = Decimal.ToDouble(maxEdit.Value);conv.Converters.Add(rc);}conv.Converters.Add(new Kent.Boogaart.Converters.TypeConverter(cdp.Channel.Type, Property.PropertyType));bind.Converter = conv;bind.Mode = BindingMode.TwoWay;DependencyObject depObj;DependencyProperty depProp;if (Property.GetWpfObjects(out depObj, out depProp))bind.FallbackValue = depObj.GetValue(depProp);return bind;}else return base.Save();
}

这里关键是WPF编程方式下System.Windows.Data.Binding类的使用,下面我们来看一个简单的WPF示例工程,该工程演示了WPF中一个TextBox的Text属性与

数据源的绑定、以及子线程中绑定数据源值更新的自动同步:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;using System.Threading;
using System.ComponentModel;namespace WpfApplication1
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public class DataSource : INotifyPropertyChanged{private int _index;public int Index{get { return _index; }set{_index = value;if (PropertyChanged != null){this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Index"));}}}public event PropertyChangedEventHandler PropertyChanged;} System.Windows.Data.Binding _bind;Thread _thread;DataSource _dataSource;bool _run;public MainWindow(){InitializeComponent();_dataSource = new DataSource();// System.Windows.Data.Binding方式_bind = new System.Windows.Data.Binding();_bind.Source = _dataSource;_bind.Path = new PropertyPath("Index");_bind.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;this.textBox1.SetBinding(TextBox.TextProperty, _bind);_run = true;_thread = new Thread(Test);_thread.Start();}void Test(){while (_run) // 里面不能放阻塞式的方法,否则逻辑可能一直卡住{_dataSource.Index++;Thread.Sleep(100);}}private void Window_Closing(object sender, CancelEventArgs e){_run = false;if (_thread != null){_thread.Join();_thread = null;}}}
}

工程界面:

实际运行界面:

posted on 2016-09-03 17:29 jayhust 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/jayhust/p/5837542.html

[开源]FreeSCADA的通道数据与控件属性关联以及自动刷新机制研究相关推荐

  1. Android 绿豆通讯录【 SQLite数据库(增删改查、展示数据) + ListView数据展示控件(展示所有数据) 】

    前情提要:Android 数据库(SQLite) [简介.创建.使用(增删改查.事务.实战演练).数据显示控件(ListView.Adapter.实战演练-绿豆通讯录)] https://blog.c ...

  2. 使用DataGridView数据窗口控件,构建用户快速输入体验

    使用DataGridView数据窗口控件,构建用户快速输入体验 在"随风飘散" 博客里面,介绍了一个不错的DataGridView数据窗口控件<DataGridView数据窗 ...

  3. ajax17,17个使用AJAX技术的数据表格控件

    为了将数据高效的展示出来,数据需要有合适的结构,展现结构设计的越好,用户就越容易理解信息的内容.因此,提高数据的可萃取性和可扫描性非常有意义. 表,是一个非常好的数据呈现结构,非常便于人们分析和理解二 ...

  4. 重复控件Repeater和数据列表控件DataList

    5.3  重复控件Repeater和数据列表控件DataList 本节介绍ASP.NET中两个数据迭代控件:Repeater和DataList控件.其中,Repeater控件又被称为重复控件:Data ...

  5. Xceed WinForm数据表格控件Xceed Grid For .NET详细介绍

    2019独角兽企业重金招聘Python工程师标准>>> Xceed Grid For .NET是一款高级的,多功能的.扩展性极强的数据表格控件,具有分组.主从表.多种主题外观.固定列 ...

  6. 数据窗口控件的函数Describe()

    Describe()  功能:返回数据窗口控件结构方面的指定信息包括DataWindow   对象以及数据窗口  对象中其他对象的属性取值数据窗口中的每个列每个标题等等都是对象各自都有一  组描述其特 ...

  7. asp.net 数据验证控件的使用实例

    操作题1 请为Zootopia 的居民,设计一个身份认证网站,使每位居民拥有合法身份.要求注册页面如下中至少包含下图中的相关信息,并实现相应的验证功能. [要求]: 1. 网站包含登录页面Login. ...

  8. 从零开始使用JavaScript编写数据表格控件(转载)

    想起来前段时间面试时遇到的问题,说是如何用javascript实现一个表格控件,说说思路,当时还不知道该怎么办,只是说使用Ext中的表格控件,被追问不使用第三方控件时如何实现就傻眼了,这篇文章介绍的非 ...

  9. 淘晶驰串口屏入门(七)数据记录控件、文件浏览器控件、文件流控件

    一.数据记录控件 1.注意data+数字开头的为数据记录控件 2.只有x3和x5系列的串口屏支持数据记录控件,k0,t0和t1系列不支持 3.使用data0.insert方法向数据记录控件添加记录 4 ...

最新文章

  1. 基于深度学习Superpoint 的Python图像全景拼接
  2. 【Android UI设计与开发】第09期:底部菜单栏(四)Fragment+PopupWindow仿QQ空间最新版底部菜单栏
  3. Spring注解标签详解@Autowired @Qualifier等
  4. [云炬python3玩转机器学习]4-3 训练数据集,测试数据集
  5. 超越用户embedding矩阵:用哈希对大型用户建模
  6. 【第九课】MriaDB密码重置和慢查询日志
  7. html数字自动滚动代码怎么写,你可能需要这样的大屏数字滚动效果
  8. page compaction原理
  9. ai怎么平均排列_一篇AI打麻将的论文,理科生眼中的麻将是这样的
  10. 按发动机排量征收汽车消费税是不合理的,应该按燃烧室容积征税
  11. Android deeplink原理解析
  12. 工行网银网上支付 提示选择证书,但下拉框是空白,无法选择导致不能支付 解决办法
  13. HAUTOJ1062
  14. Android Studio入学1-3:通过okhttp连接服务器
  15. 前端题基础练习总结。。。。
  16. 本周大新闻|沙特PIF再投Magic Leap,周融资超5.1亿美元
  17. 王春亮阿育吠陀推拿心学
  18. Flash动画个人学习总结
  19. weblogic控制台相关操作
  20. 沃通免费ssl服务器证书,新版《沃通免费SSL证书申请指南》

热门文章

  1. 玻璃体浑浊的分子原理
  2. tomcat的诡异的端口占用问题
  3. 常见的14种异常心电图的波形特点
  4. java.net.UnknownHostException: dbmtimehadoop
  5. UT890D的二极管档的使用
  6. clion修改选中行的背景颜色
  7. leetcode: 树
  8. Machine Learning之Python篇(一)
  9. 机器学习(九)——EM算法
  10. 音频的音量检测java实现_免费剪切和合并音频,小白必读