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

1. 几个重要的类列表:

a) Designer工程下的CommonBindingDialog.cs:

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

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为PropertyWrapper

        bindingPanel.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();
}
时间: 2024-12-28 14:22:58

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

.net 数据表格显示控件

1. GridView 控件 GridView 控件用于显示表中的数据.通过使用 GridView控件,您可以显示.编辑.删除.排序和翻阅多种不同的数据源(包括数据库.XML 文件和公开数据的业务对象)中的表格数据. 显示表格数据是软件开发中的一个周期性任务.ASP.NET 提供了许多工具来在网格中显示表格数据,例如 GridView 控件.通过使用GridView 控件,您可以显示.编辑和删除多种不同的数据源(例如数据库.XML 文件和公开数据的业务对象)中的数据. 可以使用 GridView

数据验证控件

1.非空数据验证控件RequiredFiledValidator. 属性:ControlToValiata 指验证控件对哪一个控件进行验证.例如验证TextBox控件的ID属性txtPwd,只要将RequiredFiledValidator.控件的ControlToValidata属性设置为txtPwd.代码:this.RequiredFiledValidator1.ControlToValidata="txtPwd"; ErrorMessage属性:用于指定页面中使用Required

【6】页面数据和控件的自动交换机制

阅读目录 数据维护通用流程 数据的加载 数据的修改 数据的添加 自动交换机制 使用PageX来完成数据的自动加载 非标准数据的处理 只要使用了数据库,那么管理和维护数据的工作就是不可避免的.应用程序中,对于数据库中数据的管理和维护,有两种情况.一种是与业务逻辑密切相关的数据,往往通过关系-对象映射的方法转换为对象,应用程序的运行就围绕这些对象进行,所以这类数据的管理维护的过程其实就是应用程序的运行过程.另外一种,就是很多的资料性的数据,涉及到数据表和数据字段都很多,但使用频度不高.对于这类数据,

android开源系列:CircleImageView自定义圆形控件的使用

1.自定义圆形控件github地址:https://github.com/hdodenhof/CircleImageView 主要的类: package de.hdodenhof.circleimageview; import edu.njupt.zhb.main.R; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import andr

【干货】再上数据分页控件 ━ 更加灵活,更加实用-提供源码

再上数据分页控件-更加灵活,更加实用 关于数据分页的文章太多了,各有各的一套方案,但大多都很类似,要么使用存储过程,要么直接使用代码进行分页.各种方案分页的效率也不尽相同,我们不一定要找一个最高效的(根据实际的项目情况),找一个最合适的就OK了.下面我要谈的分页控件非常灵活,可以支持任意类型的数据库,同时可以支持存储过程或代码分页(会自动判断),也支持多表的分页,非常的方便.对于数据分页的相关文章,在我的博客中可以找到很多,下面我做一个简单的汇总,方便大家查阅. 1. 原创企业级控件库之大数据量

跨数据存取控件Universal Data Access Components

最近发现MDT推出去的系统的有不同问题,其问题就不说了,主要是策略权限被域继承了.比如我们手动安装的很多东东都是未配置壮态,推的就默认为安全壮态了,今天细找了一下,原来把这个关了就可以了. 跨数据存取控件Universal Data Access Components

关于easyui中数据型控件使用的一些总结

easyui是个非常棒的jquery插件,不管从性能到美观,兼容性上都比较屌,一般的数据控件(如datagrid,tabs,tree)操作时最好将初始化和数据绑定分开做.先想想为什么? 我们先来谈谈坏处是什么: 1.前台最常见的就是增删改查操作,试想下如果初始化和绑定数据一起操作岂不是初始化重复了. 2.像tabs这种切换控件一般里面还要嵌套其他数据型控件,每次切换都要初始化嵌套的控件,效率低更重要的是消耗不必要的浏览器内存. ps:我做过一个实时刷新的项目,tabs内嵌套datagrid,在实

ASP.NET一个页面多个Button按钮事件避免数据验证控件RequiredFieldValidator冲突方法

说明:在ASP.NET 1.1中除了hack code没有更好的办法.ASP.NET 2.0中给所有的validator控件和按钮(button.linkbutton等等)增加了ValidatorGroup属性,就可以轻松地解决这 个问题.如果在页面中有一个TextBox并且紧挨着他有一个RequiredFieldValidator 和Button控件,可以将RequiredFieldValidator和Button的ValidationGroup属性设置成一样的值从而使得点 击button时只

UITextField控件属性

UITextField控件属性: enablesReturnKeyAutomatically 默认为No,如果设置为Yes,文本框中没有输入任何字符的话,右下角的返回按钮是disabled的. 1.borderStyle 设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone, UITextBorderStyleLine, UITextBo