• WPF 通过依赖属性Value更新长历史图表



    前言

    最近在实现一些控件,诸如仪表盘长历史图表 等。这些控件对外的接口只有一个依赖属性Value。通过绑定,可以实时接收后台产生的数据。

    public Object Value
    {
    	get { return (Object)GetValue(ValueProperty); }
    	set { SetValue(ValueProperty, value); }
    }
    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
                nameof(Value),
                typeof(Object),
                typeof(LongHistoryChart),
                new PropertyMetadata(0, new PropertyChangedCallback(OnValuePropertyChanged)));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    对于一般的控件而言,如仪表盘,通过向 PropertyMetadata 提供更改通知的回调OnValuePropertyChanged就可以实现仪表盘上的指针位置的更新。

    然而,对于长历史图表 而言,它还有一个额外的要求保存历史的数据。这时,问题就出现了。如果后台产生了连续的相同的数据,那么OnValuePropertyChanged的回调将不会被调用,进而导致长历史图只会保存连续变化的数据。这显然不是我们想要的效果。

    那如何解决这个问题呢?可以在控件内部编写UpdateValue()方法,由后台主动调用数据更新(这里更新的概念就包括了连续相同的数据)。

    注:由于我的代码中控件和后台数据更新对象没有耦合在一起,所以为了能主动调用数据更新,我还用到了反射技术调用此方法,所以接下来定义的UpdateValue()方法甚至是私有的(private)。


    1 定义UpdateValue()方法

    /// 
    /// 主动更新长历史图
    /// 
    private void UpdateValue()
    {
    	// 依赖属性的描述符,可以用于获取属性的值、监听属性变化等
    	var descriptor = DependencyPropertyDescriptor.FromProperty(
                    ValueProperty, 					//提供的依赖属性
                    typeof(LongHistoryChart));      //目标对象类型:要为其设置依赖属性的对象的类型
    
    	// 获取依赖属性的值
    	var value = descriptor.GetValue(this);
    	
    	// 下面是更新长历史图的逻辑,省略咯
        //....		
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2 主动调用UpdateValue()方法

    	// 通过反射调用控件的更新
    	// 这一句是获取控件的类型,一般可以通过控件对象通过反射,例如这里其实可以换成controlObject.GetType()
    	// 我这里提供的示例不是通用的代码,是开源代码库daimicsharpcode/WpfDesigner中的类
    	Type controlType = node.FirstProperty.DesignItem.ComponentType;
    
    	// 这一句是获取控件对象
    	var controlObject = node.FirstProperty.DesignItem.Component;
    	if (controlType != null)
    	{
    		// 设置反射搜索范围:私有的非静态的方法
    		BindingFlags flag = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod;
    		
    		// 搜索指定搜索范围的名称为"UpdateValue"的方法
    		MethodInfo method = controlType.GetMethod("UpdateValue",flag);
    		if (method != null)//调用前判断是否存在这个方法
    		{
    			// 反射调用方法
    			method.Invoke(controlObject, flag, Type.DefaultBinder, null, null);
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    后语

    本文仅仅简单介绍了WPF 通过依赖属性Value更新长历史图表,如果对你有帮助,请点个赞,如有纰漏或者你有更好的方法,烦请留言,不吝赐教,感激不尽。

  • 相关阅读:
    SpringBoot Admin监控平台《二》基础报警设置
    ssm基于微信小程序的航空售票管理系统191111
    【无代码爬虫】web scraper 之 安装
    Vue——配置代理(解决ajax跨域问题)
    数据提取2
    鸿蒙原生应用元服务开发-WebGL网页图形库开发无着色器绘制2D图形
    Flutter: Dart 参数,以及 @required 与 required
    STM32H7的LCD控制学习和应用
    阿里云服务器e系列性价比首选?性能如何?
    python解CCF-CSP真题《202206-1—归一化处理》
  • 原文地址:https://blog.csdn.net/yan_yu_lv_ji/article/details/127945360