模拟实现WPF的依赖属性及绑定通知机制(2)--依赖对象的准备

WPF字典集合类ObservableDictionary WPF最核心的技术优势之一就是数据绑定。数据绑定,可以通过对数据的操作来更新界面。 数据绑定最经常用到的是ObservableCollection<T> 和Dictionary<T, T> 这两个类。 ObservableCollection表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知,可以通过更新集合数据来更新界面显示。 Di... 阅读详情

依赖对象一个主要的功能就是提供对依赖属性属性值的管理,所有需要具有依赖属性的类都可以从这里继承,而无需自己去管理依赖属性值。依赖对象的主要方法就是SetValue和GetValue两个方法,这也是依赖属性和普通属性获取值不一样的地方,当然实际的应用中依赖属性一般不会直接使用这两个方法,而是封装成普通属性方式。另外对于依赖属性,我们还提供了一个属性值发生变化时依赖对象可以截获的回调机制,这样做的目的是增加对依赖属性的控制,但需要注意的是这个控制是针对类的,而不是实例,因此处理的时候需要注意到这个特性。

1)为了提供这个特性我们需要定义一个用于回调的委托:

public delegate void MyPropertyChangedCallback(MyDependencyObject d, MyDependencyPropertyChangedEventArgs e);

2)定义一个所谓的元数据类,其实就是为了记载确实值,回调参数的类

/// <summary>
    /// 属性元数据类,目标是为了存储属性的缺省值和值发生变化时的回调函数
    /// 其实在注册依赖属性的时候,可以直接将该类的成员加上,但这样的做法不利于扩展,
    /// 因为你可以继承这个MyPropertyMetadata这个类,增加信息量,而不需要更改依赖
    /// 属性的结构。
    /// </summary>
    public class MyPropertyMetadata
    {
        public MyPropertyChangedCallback PropertyChangedCallback { get; private set; }
        public object DefaultValue { get; private set; }
        public MyPropertyMetadata(object DefaultValue = null, MyPropertyChangedCallback Callback=null)
        {
            this.PropertyChangedCallback = Callback;
            this.DefaultValue = DefaultValue;
        }
    }

3)参数定义如下:(这里我只是在微软相关类的基础上做了小修改)

 /// <summary>
    /// 属性发生改变时的参数
    /// </summary>
    public class MyDependencyPropertyChangedEventArgs
    {
      
            // 摘要:
            //     获取发生更改之后的属性的值。
            //
            // 返回结果:
            //     发生更改之后的属性值。
        public object NewValue { get; private set; }
            //
            // 摘要:
            //     获取发生更改之前的属性的值。
            //
            // 返回结果:
            //     发生更改之前的属性值。
        public object OldValue { get; private set; }
            //
            // 摘要:
            //     获取发生值更改的依赖项属性的标识符。
            //
            // 返回结果:
            //     发生值更改的依赖项属性的标识符字段。
        public MyDependencyProperty Property { get; private set; }
        public MyDependencyPropertyChangedEventArgs(object NewValue, object OldValue, MyDependencyProperty Property)
        {
            this.NewValue = NewValue;
            this.OldValue = OldValue;
            this.Property = Property;
        }

    }

4)除了上述的功能,我们还要提供WPF的绑定机制的模拟,因此我们在依赖对象类中还提供了对绑定的管理和处理,下面是绑定的定义,比微软的要简化很多:

/// <summary>
    /// 绑定设置类。
    /// </summary>
    public class MyBinding
    {
        public object TargetObject { get; set; }
        public string PropertyName { get; set; }
    }

这个类主要提供对绑定目标对象和属性的记载,我这里是模拟,我没有采用Path路径方式,但原理跟属性差不多,只不过要进行简单的语法分割,形成一个属性路径而已。

WPF数据绑定原理与INotifyPropertyChanged工程实践 WPF数据绑定是声明式UI开发的核心机制,其本质依赖于INotifyPropertyChanged接口实现属性变更的自动通知。该机制通过建立属性依赖图,使UI能响应数据变化,支撑起MVVM等现代架构模式。技术价值在于解耦UI与业务逻辑、提升可维护性与测试性,并为跨平台框架(如MAUI、Avalonia)提供设计范式基础。典型应用场景包括桌面管理后台、企业级配置工具及实时数据看板。本文深入剖析INotifyPropertyChanged的手动实现要点、链式通知原理,以及ObjectDataProvider与I 阅读详情

相关推荐

C# WPF太阳系模拟器开发:从数据绑定到3D渲染的完整实现

数据可视化是将抽象数据转化为直观图形的关键技术,其核心原理在于建立数据模型与视觉元素的映射关系。在桌面应用开发中,WPF框架凭借其强大的数据绑定和声明式UI系统,成为实现复杂动态可视化的高效工具。通过MVVM模式,业务逻辑与界面渲染得以解耦,结合Storyboard动画和3D变换能力,开发者能够构建出既美观又交互丰富的应用程序。本文以太阳系行星运转模拟器为例,深入探讨了如何利用WPF的Media3D命名空间进行3D建模,并通过时间驱动算法精确模拟天体运动,为教学演示、科学仿真等场景提供了完整的工程实践参考。

weixin_33985507的博客 395

模拟实现WPF的依赖属性及绑定通知机制(3)--依赖对象

下面是依赖对像类的实现:(注,这里涉及到INotifyPropertyChanged接口,大家可以参考MSDN文档了解). /// &lt;summary&gt; /// 依赖对像,主要提供属性值和属性绑定的管理。 /// &lt;/summary&gt; public class MyDependencyObject { private IDictionary&lt;MyD...

javasalatu 280

WPF DataContext实战:三种绑定方式深度解析

本文深入解析WPF中DataContext的三种绑定方式,包括XAML声明式绑定、代码隐藏赋值和ViewModel定位器模式。通过实战案例和对比分析,帮助开发者掌握DataContext的核心作用与最佳实践,提升WPF开发效率和应用性能。

weixin_27330481的博客 419

【WPF绑定2】 INotifyPropertyChanged Or 依赖属性

在上一节,我们介绍了ListBox的基础绑定版,简单来说就是将一个数组结构赋值给了listbox的ItemsSource属性,就实现了绑定。 这次我们来看看,当属性绑定数据源之后,当数据源发生改变时,如何让属性跟随变换。 首先我们需要定义一个类Status,并实现接口 INotifyPropertyChanged 看名字就知道了它就是起一个通知的作用! 这个接口只定义了一个事件 // // 摘要: // 通知客户端属性值已更改。 public interface INotifyProper

songhuangong123的博客 1782

WPF DataGrid中ComboBox数据绑定与联动实战指南

在WPF桌面应用开发中,数据绑定是实现视图与模型分离的核心机制,它通过INotifyPropertyChanged接口和ObservableCollection等组件,建立起数据与UI的动态响应关系。其技术价值在于提升代码可维护性、实现数据驱动界面更新,并支持复杂的用户交互逻辑。这一原理在数据密集型表单场景中尤为重要,例如在DataGrid表格内集成可交互的下拉选择控件。本文将深入探讨如何在DataGrid中实现ComboBox列的深度数据绑定、默认值显示以及跨列动态联动,通过DataGridTemplat

weixin_33976072的博客 504

CST仿真实例001:圆极化平板天线仿真

CST仿真实例001:圆极化平板天线仿真实例

weixin_47638568的博客 1万+

面试官:实现一个带值变更通知能力的Dictionary

如题, 你知道字典KEY对应的Value什么时候被覆盖了吗?最近大家都在追.Net6 update,咱还是保持节奏,通用语言聊技术。没背景说个铲铲 上文中数据获取组件维护了业...

qq_30236895的博客 232

看完这篇爽文我终于学会了示波器(一)

示波器基础篇的介绍,希望对你有用,下次分享一下如何测试。

qq_45508321的博客 974

模拟实现WPF的依赖属性及绑定通知机制(2)--依赖对象的准备 .

2011-08-28 09:04 183人阅读 评论(0) 收藏 举报 依赖对象一个主要的功能就是提供对依赖属性属性值的管理,所有需要具有依赖属性的类都可以从这里继承,而无需自己去管理依赖属性值。依赖对象的主要方法就是SetValue和GetValue两个方法,这也是依赖属性和普通属性获取值不一样的地方,当然实际的应用中依赖属性一般不会直接使用这两个方法,而是封装成普通属性方式。另

蓝叶菱的专栏 640

ArcGIS+PLUS+InVEST三件套实战:从零搞定土地利用变化与碳储量预测(附完整数据包)

本文详细介绍了如何整合ArcGIS、PLUS模型和InVEST模型,构建土地利用变化与碳储量预测的完整研究流水线。通过多情景模拟和生态系统服务评估,提供从数据准备到结果验证的实战指南,助力研究者高效完成生态评估项目。

weixin_30399821的博客 543

STC15单片机实战项目软件开发第四讲 - 按键检测(状态机)

软件开发第四讲 - 按键检测(状态机) 一、工具链接 1、Keil c51 UV4 https://yunpan.360.cn/surl_yrIfYYmeRFk 2、STC-ISP下载软件 https://yunpan.360.cn/surl_yxH4CuUUvI3 二、学习板获取方式 方法1:自己设计PCB,自行打板焊接; 方法2:用群主设计的PCB,自行打板焊接; 方法3:向群主购买,淘宝链接...

硬件家园 3047

WPF依赖属性,绑定通知机制系列补充说明

依赖对象准备增加了属性元数据类型的定义,开始忘记贴了。以上代码都经过了测试,模拟是成功的。其实微软在页面中的绑定语法最终都会如模拟中那样实现。微软的做法是导入xaml文件的时候根据文件中的控件语法动态的生成控件实例,其绑定语法也是在这个过程中自动添加进出的,只不过需要一个简单的路

三人行必有我师,手写三行必有所悟 5224

信创环境下,软件测试如何破局?

毕竟,在自主可控的道路上,每一行通过测试的代码,都在为信创产业的未来添砖加瓦。未来,测试工程师不仅要验证软件在信创环境的可用性,更要基于国产软硬件的特性,推动软件进行 “原生设计”—— 例如,针对国产 CPU 的多核架构优化代码,基于国产数据库的索引机制提升查询效率。某政务云平台的测试数据显示,在 “飞腾芯片 + 麒麟操作系统” 环境下,系统的并发处理能力较传统环境下降约 15%,测试团队通过优化软件的线程调度逻辑,最终将性能损失控制在 5% 以内 —— 这正是信创性能测试的价值所在。

weixin_45608163的博客 886

WPF依赖属性原理与TDD复现实践

依赖属性是WPF数据绑定、样式继承和动画系统的核心机制,本质是一种基于元数据的运行时属性管理系统,区别于传统.NET属性的字段封装模式。其设计围绕唯一标识、值存储分离、元数据驱动和线程安全四大原理展开,通过DependencyProperty(属性契约)、DependencyObject(值容器)、PropertyMetadata(行为规则)和DependencyPropertyKey(权限控制)协同工作。该机制显著提升UI框架的可扩展性与性能,广泛应用于企业级WPF客户端、医疗影像工作站及跨平台UI重构项

dianlu5775的博客 486

[Ethernet in CANoe]2--如何在CANoe中去仿真CP版本的SOME/IP通信

上篇文章()介绍了SOME/IP的两种类型的数据格式,根据作者目前的项目经验,目前在CANoe V18之前的版本,CP版本的arxml是最方便实现SOME/IP以太网仿真的。作者目前只有CANoe V17的license,所以本片文章是在CANoe 17上基于CP版本的arxml去做仿真模拟。

汽车ECU自动化测试 1764

20.Labview使用子vi进行VI间的数据传递详解(模块化)

子VI(模块化)题主在题注中也提到, 子VI的建立只是为了减少程序的负担,那么我们当使用子VI的时候首先就要明确什么是子VI?什么样的程序可以作为子VI?首先我们来看NI官方给的定义,具体说明如下图所示:题主已经将重点画出来了,在官方的解释中将子VI定义为了模块化,大家可以看到创建模块化子VI的特点在于减少代码重复工作优化了程序的框架结构。把一个代码打包,需要的时候就拎出来让他处理处理,不需要的时候就让它躺在我的列表里就行了也不占用运行空间。那么创建子VI需要需要注意以下几点:①任何一个程序。

关注我,更多技术问题欢迎私聊~ 3516

博文整理(编程技术深入解剖系列--Silverlight,WPF及实战示例)

这个系列主要针对的是Silverlight相关的编程技术,探讨层次比较深入,这里整理了一下,方便大家阅读: WPF架构关键技术剖析(1)--序言 WPF架构关键技术剖析(2)--XAML、对象序列化、类动态实例化 WPF架构关键技术剖析(3)--做自己的交互Action(1

三人行必有我师,手写三行必有所悟 3180

人工智能数据治理——解读AI时代数据治理白皮书 2025【附全文阅读】

摘要:该白皮书面向企业数字化负责人及AI项目推进人员,探讨AI时代数据治理的战略升级。提出"好数据+好数据知识"双基石理念,强调数据需满足"三高"标准(高精度、一致性、时效性)并构建语义知识库。构建四层治理框架,包括数据采集处理、合规安全、知识库建设及质量改进,并介绍AI赋能治理的新范式,如智能ETL和治理Agent体系。同时分析"软件+AI+好数据"的应用模式,为企业实现智能数据治理提供实践指导。(149字)

cdfunlove的博客 633

wifit3 怎么给 USB 无线网卡评级?五维评级体系实操指南

插一张 20 美元的 USB 无线网卡,wifit3 的网卡评级会在 20 分钟后给出 60% (D)。原因不一定是这款 USB 无线审计工具的移植做得差,也可能是芯片本身接收不行——评级体系要做的,就是把这两种原因分开。 [![wifit3 USB 无线网卡评级启动界面:选择支持的适配器后按 START 开始](https://raw.gitcode.com/GitHub_Trending/w

gitblog_00130的博客 654

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: 模拟实现WPF的依赖属性及绑定通知机制(1)--依赖属性
下一篇: 模拟实现WPF的依赖属性及绑定通知机制(3)--依赖对象
广州接入
广州接入 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄24年 2224粉丝 731原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值