三个概念:DataBinding,Dependency Property 与DataTemplate

WPF 核心概念详解:DataBinding、Dependency Property 和 DataTemplate

1. DataBinding (数据绑定)

基本概念

DataBinding 是 WPF 的核心机制,用于在 UI 元素和数据源之间建立自动同步关系。

关键特性

  • 双向绑定:数据变化自动反映到 UI,UI 变化也能更新数据源

  • 绑定模式

    • OneWay:源→目标

    • TwoWay:源↔目标

    • OneWayToSource:目标→源

    • OneTime:仅初始化时绑定一次

基本语法

<TextBox Text="{Binding Path=UserName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

代码示例

public class User : INotifyPropertyChanged
{private string _name;public string Name{get => _name;set { _name = value; OnPropertyChanged(); }}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged([CallerMemberName] string name = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));}
}// 在窗口或控件中设置数据上下文
this.DataContext = new User { Name = "Alice" };

2. Dependency Property (依赖属性)

基本概念

依赖属性是 WPF 特有的属性系统,支持:

  • 样式设置

  • 数据绑定

  • 动画

  • 属性值继承

  • 默认值和元数据

创建依赖属性

public class MyControl : Control
{public static readonly DependencyProperty ValueProperty =DependencyProperty.Register("Value",                     // 属性名称typeof(int),                 // 属性类型typeof(MyControl),           // 所有者类型new PropertyMetadata(0, OnValueChanged)); // 元数据public int Value{get { return (int)GetValue(ValueProperty); }set { SetValue(ValueProperty, value); }}private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){// 属性变化时的处理逻辑}
}

依赖属性优势

  1. 内存效率:只有被修改的属性才存储实际值

  2. 内置变更通知:无需实现 INotifyPropertyChanged

  3. 属性值继承:如字体设置可沿可视化树继承

  4. 样式和模板支持:可被样式和模板轻松修改

3. DataTemplate (数据模板)

基本概念

DataTemplate 定义了如何显示数据对象,将数据与可视化元素关联。

基本用法

<ListBox ItemsSource="{Binding Users}"><ListBox.ItemTemplate><DataTemplate><StackPanel Orientation="Horizontal"><TextBlock Text="{Binding Name}" FontWeight="Bold"/><TextBlock Text="{Binding Age}" Margin="5,0,0,0"/></StackPanel></DataTemplate></ListBox.ItemTemplate>
</ListBox>

高级用法

1. 根据类型自动选择模板
<Window.Resources><DataTemplate DataType="{x:Type local:Student}"><!-- 学生类型的显示方式 --></DataTemplate><DataTemplate DataType="{x:Type local:Teacher}"><!-- 教师类型的显示方式 --></DataTemplate>
</Window.Resources><ContentControl Content="{Binding CurrentPerson}"/>
2. 带命令的模板
<DataTemplate><Button Command="{Binding DataContext.SelectCommand, RelativeSource={RelativeSource AncestorType=ListBox}}"CommandParameter="{Binding}"><TextBlock Text="{Binding Name}"/></Button>
</DataTemplate>

三者的协同工作

┌───────────────────────┐    ┌───────────────────────┐
│      Dependency       │    │                       │
│       Property        │◄───┤     DataBinding       │
└───────────────────────┘    │                       │▲                     └───────────────────────┘│                                ▲│                                │
┌───────────────────────┐    ┌───────────────────────┐
│     DataTemplate      │    │        Model          │
│                       │    │                       │
└───────────────────────┘    └───────────────────────┘
  1. Dependency Property 提供数据绑定的目标

  2. DataBinding 连接 UI 元素和数据源

  3. DataTemplate 定义复杂数据对象的可视化方式

实际应用示例

综合示例:人员列表应用

// Model
public class Person : INotifyPropertyChanged
{private string _name;public string Name{get => _name;set { _name = value; OnPropertyChanged(); }}// INotifyPropertyChanged 实现...
}// ViewModel
public class PeopleViewModel
{public ObservableCollection<Person> People { get; } = new ObservableCollection<Person>();public ICommand AddCommand { get; }public PeopleViewModel(){AddCommand = new RelayCommand(AddPerson);}private void AddPerson(){People.Add(new Person { Name = $"New Person {People.Count + 1}" });}
}
<!-- View -->
<Window x:Class="PeopleApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="People App" Height="350" Width="525"><Window.Resources><DataTemplate DataType="{x:Type local:Person}"><StackPanel Orientation="Horizontal"><TextBlock Text="{Binding Name}" Width="200"/><Button Content="Remove" Command="{Binding DataContext.RemoveCommand, RelativeSource={RelativeSource AncestorType=ListBox}}"CommandParameter="{Binding}" Margin="5,0"/></StackPanel></DataTemplate></Window.Resources><DockPanel><Button DockPanel.Dock="Bottom" Content="Add Person" Command="{Binding AddCommand}" Margin="5" Padding="10,3"/><ListBox ItemsSource="{Binding People}" HorizontalContentAlignment="Stretch"/></DockPanel>
</Window>

总结对比表

特性DataBindingDependency PropertyDataTemplate
主要用途连接数据和UI扩展属性系统定义数据可视化方式
关键优势自动同步支持样式/绑定/动画数据与显示分离
典型应用场景MVVM模式中的数据更新自定义控件开发列表/集合数据显示
是否必需接口通常需要INotifyPropertyChanged不需要不需要
性能考虑大量绑定可能影响性能比CLR属性更高效复杂模板可能影响渲染性能

这三种技术共同构成了 WPF 强大数据展示和交互能力的基础,理解它们的原理和相互关系对于开发高质量的 WPF 应用至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/78863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言教程(二十六):C 语言内存管理详解

一、C 语言内存区域划分 在 C 语言程序运行时,内存主要分为以下几个区域: 1.1 栈区(Stack) 特点:由编译器自动分配和释放,主要存储函数的局部变量、函数参数、返回地址等。栈区的内存分配和释放是按照后进先出(LIFO)的原则进行的,速度快。示例: #include <stdio.…

腾讯云服务器性能提升全栈指南(2025版)

腾讯云服务器性能提升全栈指南&#xff08;2025版&#xff09; 一、硬件选型与资源优化 1. 实例规格精准匹配 腾讯云服务器提供计算型CVM、内存型MEM、大数据型Hadoop等12种实例类型。根据业务特性选择&#xff1a; • 高并发Web应用&#xff1a;推荐SA3实例&#xff0…

决策树在电信客户流失分析中的实战应用

在当今数据驱动的时代&#xff0c;数据分析和机器学习技术在各行业的应用愈发广泛。电信行业面临着激烈的竞争&#xff0c;客户流失问题成为影响企业发展的关键因素之一。如何准确预测客户是否会流失&#xff0c;并采取相应措施挽留客户&#xff0c;是电信企业关注的重点。决策…

【HCIA】VRRP

前言 二层交换机为了破环发明了堆叠&#xff0c;把几台实际的交换机视作一个虚拟的交换机&#xff0c;实现了链路的复用和环路的破坏。那么对应到三层的路由器&#xff0c;我们有 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;&#xff0c;它可以让路由器分…

第15讲:基础柱状图与分组柱状图美化指南

目录 🧭 一、为什么要关注柱状图的“美化”? 🧱 二、基础柱状图的构建逻辑(以 ggplot2 为例) 🎨 三、美化细节全面升级 ✅ 1. 自定义配色与透明度 ✅ 2. 添加数值标签 ✅ 3. 设置 y 轴刻度与坐标轴美学 👨‍🔬 四、分组柱状图(Grouped Bar Plot) 💎 五…

SV 仿真的常识

文章目录 SV对verilog的扩展&#x1f4d8; 标准文档名称&#xff1a; 从SV到仿真通用过程解读实例解读 SV的仿真过程并行仿真颗粒度SV仿真调度调度区域 SV对verilog的扩展 SystemVerilog 和 Verilog 的语法标准由 **IEEE&#xff08;美国电气和电子工程师协会&#xff09;**制…

苏德战争前期苏联损失惨重(马井堂)

苏德战争前期&#xff08;1941年6月22日德国发动“巴巴罗萨行动”至1941年底至1942年初&#xff09;是苏联在二战中损失最惨重的阶段之一。以下是主要方面的损失概述&#xff1a; ‌一、军事损失‌ ‌人员伤亡与俘虏‌ 至1941年底&#xff0c;苏军伤亡约‌300万人‌&#xff…

联邦学习的收敛性分析(全设备参与,不同本地训练轮次)

联邦学习的收敛性分析 在联邦学习中,我们的目标是分析全局模型的收敛性,考虑设备异构性(不同用户的本地训练轮次不同)和数据异质性(用户数据分布不均匀)。以下推导从全局模型更新开始,逐步引入假设并推导期望损失的递减关系,最终给出收敛性结论。 1. 全局模型更新与泰…

多线程爬虫中实现线程安全的MySQL连接池

多线程爬虫中实现线程安全的MySQL连接池 在日常开发中&#xff0c;数据库操作频繁建立/关闭连接会带来性能损耗&#xff0c;尤其在多线程场景中更容易出现连接复用、阻塞等问题。因此&#xff0c;本文介绍如何使用 Python 封装一个 线程安全的 MySQL 连接池&#xff0c;并通过…

HTML:常用标签(元素)汇总

文章目录 一、标签分类1、块标签与行标签 二、排版标签三、文本标签1、常用2、不常用 四、图片标签五、超链接1、跳转页面2、跳转文件或下载文件3、跳转到锚点4、唤起本地应用 六、列表七、表格八、表单九、框架十、HTML实体十一、全局属性十二、meta元信息 一、标签分类 1、块…

20250430在ubuntu14.04.6系统上完成编译NanoPi NEO开发板的FriendlyCore系统【严重不推荐,属于没苦硬吃】

【开始编译SDK之前需要更新源】 rootrootubuntu:~/friendlywrt-h3$ sudo apt update 【这两个目录你在ubuntu14.04.6系统上貌似git clone异常了】 Y:\friendlywrt-h3\out\wireguard Y:\friendlywrt-h3\kernel\exfat-nofuse 【需要单线程编译文件系统&#xff0c;原因不明】 Y:…

【AI论文】CipherBank:通过密码学挑战探索LLM推理能力的边界

摘要&#xff1a;大型语言模型&#xff08;LLMs&#xff09;已经展现出非凡的能力&#xff0c;尤其是最近在推理方面的进步&#xff0c;如o1和o3&#xff0c;推动了人工智能的发展。尽管在数学和编码方面取得了令人印象深刻的成就&#xff0c;但在需要密码学专业知识的领域&…

艺术与科技的双向奔赴——高一鑫荣获加州联合表彰

2025年4月20日,在由M.A.D公司协办的“智艺相融,共赴价值巅峰”(Academic and Artistic Fusion Tribute to the Summit of Value)主题发布会上,音乐教育与科技融合领域的代表人物高一鑫,因其在数字音乐教育与中美文化交流方面的杰出贡献,荣获了圣盖博市议员Jorge Herrera和尔湾市…

【深度学习的灵魂】图片布局生成模型LayoutPrompt(1)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;《深度学习理论直觉三十讲》_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目…

Compose笔记(二十)--TextField

这一节主要了解一下Compose的TextField,TextField 是一个用于接收用户文本输入的 UI 组件,允许用户通过键盘输入、编辑或删除文本。简单用法总结如下: API value&#xff1a;当前输入的文本内容。 onValueChange 含义&#xff1a;当用户输入文本时触发的回调函数&#xff0c;参…

在Linux虚拟机下使用vscode,#include无法跳转问题

总结&#xff1a;需要通过Linux指令来添加编译器和压缩文件&#xff0c;解压&#xff0c;这样获得的编译器会具有可执行权限类似于 -rwxr-xr-x 1 user user 12345 Apr 26 14:22 myscript.sh 如果你直接从window中拖入文件到Linux文件下&#xff0c;你需要自己来再度开启可编译…

ArcGIS+GPT:多领域地理分析与决策新方案

技术点目录 AI大模型应用ArcGIS工作流程及功能prompt的使用技巧AI助力工作流程AI助力数据读取AI助力数据编辑与处理AI助力空间分析AI助力遥感分析AI助力二次开发AI助力科研绘图ArcGISAI综合应用了解更多 ——————————————————————————————————…

基础术语说明

车间&#xff1a;工厂内集中进行加工或装配的独立空间&#xff0c;配备设备、工具及人员&#xff0c;是生产活动的核心载体。 比如装配车间、总装车间、油漆车间等 生产线&#xff1a;以流水作业形式将原材料转化为成品的设备与人员的组合系统&#xff0c;强调连续性和效率。…

Splunk 使用Role 实现数据隔离

很多人知道 Splunk 有很多自带的Role, 今天我就要说说定制化的Role: 1: 在创建新role 的界面: 2: 在如下的界面,可以定制allow index name: 3: 创建好新Role 后,在SAML 添加新的group 的时候,就可以看到Role 给某个group: 4: 这样一个特定组的人来申请Splunk 权限,就可…

利用李雅普诺夫稳定性理论设计模型参考自适应系统(2.0)

上一篇介绍了利用李雅普诺夫稳定性理论设计模型参考自适应系统&#xff0c;通过在被控对象前面添加一个可调增益&#xff0c;然后利用李雅普诺夫稳定性理论设计增益的自适应率&#xff0c;使得被控对象输出与参考模型输出一致。本文将介绍在系统结构中引入前馈和反馈的结构&…