WPF中的绑定知识详解(含案例源码分享)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:WPF 案例及知识分享专栏
✨特色专栏:乐趣国学-心性养成之路
🥭本文内容:WPF中的绑定知识详解(含案例源码分享)
文章目录
- 1、单向绑定
- 2、双向绑定
- 3、单向到源绑定
- 4、命令绑定

当谈到WPF中的绑定,我们通常指的是数据绑定。数据绑定是一种机制,用于将数据源与用户界面元素(如控件)进行连接,以便在数据源发生更改时自动更新界面元素。这种机制使得开发人员能够轻松地实现MVVM(Model-View-ViewModel)模式,将数据和界面逻辑分离开来。
在WPF中,有几种不同类型的绑定可供选择,包括:
- 单向绑定(OneWay Binding):数据源的更改会自动更新目标元素,但目标元素的更改不会反向更新数据源。
- 双向绑定(TwoWay Binding):数据源的更改会自动更新目标元素,同时目标元素的更改也会反向更新数据源。
- 单向到源绑定(OneWayToSource Binding):只有目标元素的更改会反向更新数据源,数据源的更改不会更新目标元素。
- 命令绑定(Command Binding):将命令与界面元素进行绑定,以便在用户交互时执行特定的操作。
1、单向绑定
单向绑定是一种数据绑定模式,它将数据源的值绑定到目标元素(如控件)的属性,使得当数据源的值发生变化时,目标元素的属性会自动更新。但是,目标元素的属性的更改不会反向更新数据源。
在WPF中,可以使用单向绑定来实现将数据源的值显示在界面上,而不需要手动更新界面元素。这对于显示静态数据或只读数据非常有用。
下面是一个示例,演示了如何在WPF中使用单向绑定:
<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="OneWay Binding Example" Height="200" Width="300"><StackPanel><TextBlock Text="{Binding Name}" /><TextBlock Text="{Binding Age}" /></StackPanel>
</Window>
public class Person : INotifyPropertyChanged
{private string _name;public string Name{get { return _name; }set{_name = value;OnPropertyChanged(nameof(Name));}}private int _age;public int Age{get { return _age; }set{_age = value;OnPropertyChanged(nameof(Age));}}public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}
在这个案例中,我们创建了一个Person类,它实现了INotifyPropertyChanged接口,该接口用于通知界面元素属性的更改。Person类包含一个Name属性和一个Age属性。
在XAML中,我们使用了单向绑定将两个TextBlock的Text属性分别绑定到Person对象的Name属性和Age属性。当Person对象的属性值发生变化时,TextBlock的内容会自动更新。
public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();// 创建Person对象并设置属性值Person person = new Person();person.Name = "John";person.Age = 30;// 将Person对象设置为数据上下文DataContext = person;}
}
在代码中,我们创建了一个MainWindow窗口,并将Person对象设置为窗口的数据上下文(DataContext)。这样,窗口中的绑定表达式就可以找到Person对象并绑定到它的属性。
当运行这个示例时,窗口中的两个TextBlock将显示Person对象的Name属性和Age属性的值。如果我们在代码中更改Person对象的属性值,TextBlock的内容将自动更新。
这就是单向绑定的详细阐述和一个简单的案例展示。通过单向绑定,我们可以轻松地将数据源的值显示在界面上,实现数据和界面的分离。
2、双向绑定
双向绑定的概念: 双向绑定允许界面元素与数据模型之间的双向通信,确保它们保持同步。当你在界面元素上进行更改时,数据模型将相应地更新,反之亦然。这大大简化了开发过程,特别是在处理用户输入和表单数据时非常有用。
在XAML中实现双向绑定: 在WPF中,你可以使用XAML来实现双向绑定。以下是一个简单的示例,说明如何将TextBox和ViewModel中的属性双向绑定:
<TextBox Text="{Binding Name, Mode=TwoWay}" />
上述代码中,我们将TextBox的Text属性与ViewModel中的Name属性进行双向绑定。Mode=TwoWay 表示双向绑定,当TextBox的文本更改时,ViewModel的Name属性也会相应更新,反之亦然。
在ViewModel中创建属性: 你需要在ViewModel中创建具有适当的属性通知机制的属性。通常,你可以使用INotifyPropertyChanged接口来实现这一点。以下是一个示例:
public class MyViewModel : INotifyPropertyChanged
{private string _name;public string Name{get { return _name; }set{if (_name != value){_name = value;OnPropertyChanged(nameof(Name));}}}public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}
双向绑定的案例展示: 让我们假设你有一个WPF窗口,其中包含一个TextBox和一个TextBlock。TextBox用于编辑用户名,TextBlock用于显示用户名。你可以实现双向绑定,以便在TextBox中输入内容时,TextBlock会立即更新,反之亦然。
XAML部分:
<TextBox Text="{Binding Name, Mode=TwoWay}" />
<TextBlock Text="{Binding Name}" />
ViewModel部分:
public class MyViewModel : INotifyPropertyChanged
{private string _name;public string Name{get { return _name; }set{if (_name != value){_name = value;OnPropertyChanged(nameof(Name));}}}public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}
在窗口的构造函数中,你需要将ViewModel与窗口的DataContext关联起来:
public MainWindow()
{InitializeComponent();DataContext = new MyViewModel();
}
这样,TextBox和TextBlock将与ViewModel中的Name属性进行双向绑定。当你在TextBox中输入内容时,TextBlock会立即更新,反之亦然。
3、单向到源绑定
单向到源绑定是通过WPF中的Binding类实现的。这种绑定类型通常在用户编辑UI元素(如文本框或滑块)中输入数据时使用,以将这些更改传递回数据源,如ViewModel或数据对象。当用户在UI元素中输入数据时,单向到源绑定将数据源更新为UI元素的值。
在XAML中,你可以使用以下方式创建一个单向到源绑定:
<TextBox Text="{Binding PropertyName, Mode=OneWayToSource}" />
在这里,PropertyName 是你想要绑定的属性名称,而 Mode=OneWayToSource 表示这是一个单向到源绑定。
案例展示:
假设你有一个简单的WPF应用程序,其中你需要将用户输入的数据绑定到一个ViewModel中的属性。以下是一个示例:
首先,创建一个ViewModel类:
public class MyViewModel : INotifyPropertyChanged
{private string _textProperty;public string TextProperty{get { return _textProperty; }set{if (_textProperty != value){_textProperty = value;OnPropertyChanged("TextProperty");}}}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}
在XAML中,创建一个TextBox并将其绑定到ViewModel的TextProperty:
<TextBox Text="{Binding TextProperty, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" />
这里,我们使用Mode=OneWayToSource来指定单向到源绑定,并使用UpdateSourceTrigger=PropertyChanged来在文本框内容更改时立即更新源。
在代码中,将ViewModel设置为窗口的DataContext,并处理窗口加载事件:
public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();MyViewModel viewModel = new MyViewModel();this.DataContext = viewModel;}
}
现在,当用户在TextBox中输入数据时,这些数据将自动更新到ViewModel的TextProperty属性中,因为我们使用了单向到源绑定。这样,你可以实现用户输入与数据源之间的双向通信。
4、命令绑定
命令绑定是一种将用户界面元素的操作与后端逻辑代码进行连接的机制。通过命令绑定,您可以将按钮点击、菜单选择等用户操作与特定的命令关联起来,而不需要直接处理事件。
命令绑定的优点之一是它可以将用户界面的逻辑与后端代码解耦,使代码更加清晰和可维护。此外,命令绑定还可以轻松地实现命令的重用,因为多个界面元素可以绑定到同一个命令上。
下面是一个简单的案例展示,说明如何在WPF中使用命令绑定:
首先,您需要在后端代码中创建一个实现了ICommand接口的命令类。例如,我们创建一个名为MyCommand的命令类:
public class MyCommand : ICommand
{public event EventHandler CanExecuteChanged;public bool CanExecute(object parameter){// 在这里编写判断命令是否可执行的逻辑return true;}public void Execute(object parameter){// 在这里编写命令执行的逻辑MessageBox.Show("命令已执行!");}
}
然后,在XAML中,您可以将命令绑定到按钮的Command属性上:
<Button Content="点击我" Command="{Binding MyCommand}" />
接下来,您需要在后端代码中创建一个命令实例,并将其绑定到界面的DataContext上:
public class ViewModel
{public ICommand MyCommand { get; set; }public ViewModel(){MyCommand = new MyCommand();}
}
最后,在窗口的构造函数中,将ViewModel实例赋值给窗口的DataContext:
public MainWindow()
{InitializeComponent();DataContext = new ViewModel();
}
现在,当用户点击按钮时,命令将被执行,弹出一个消息框。
这只是一个简单的示例,您可以根据实际需求扩展和定制命令的逻辑。通过命令绑定,您可以更好地组织和管理WPF应用程序中的用户界面逻辑。
码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识,点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

相关文章:
WPF中的绑定知识详解(含案例源码分享)
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
【JVM】类的生命周期
【JVM】类的生命周期 文章目录 【JVM】类的生命周期1. 生命周期概述2. 加载阶段3. 连接阶段3.1 验证3.2 准备3.3 解析 4. 初始化阶段4.1 触发初始化的方式4.2 clinit不存在的情况4.3 多个类的初始化 5. 总结 1. 生命周期概述 类的生命周期分为5/7个阶段: 加载(Loa…...
asp.net网上商城系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio协同过滤设计
一、源码特点 asp.net网上商城系统是一套完善的web设计管理系统系统采用协同过滤算法进行商品推荐,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库 为sqlserver2008,使用c#语言开发 ASP…...
APUS入驻百度灵境矩阵,普惠AI大模型插件能力
10月17日,APUS出席百度世界大会2023。会上,百度公布了灵境矩阵业务进展,APUS作为灵境矩阵首批合作伙伴正与百度携手拓展大模型能力边界、构建大模型应用生态。 百度认为,大模型将繁荣AI应用生态,在生态搭建过程中&…...
通过C++调用Com接口
头文件 #include <iostream> #include <Windows.h> #include <comdef.h> #include <rpcdce.h> using namespace std; #pragma comment(lib, "Rpcrt4.lib")72C24DD5-D70A-438B-8A42-98424B88AFB8 通过Wscript.Shell来创建进程: void Wscri…...
完全背包问题
目录 1. 朴素解法 2. 优化 原题链接: 3. 完全背包问题 - AcWing题库 题目描述: 有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。 第 i 种物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些…...
J2EE的N层体系结构
J2EE平台采用了多层分布式应用程序模型,实现不同逻辑功能的应用程序被封装到不同的构件中,处于不同层次的构件可被分别部署到不同的机器中。 RMI/IIOP:RMI(Remote Method Invocation,远程方法调用)是Java的…...
Quirks(怪癖)模式是什么?它和 Standards(标准)模式有什么区别?
目录 前言: 用法: 代码: Quirks模式示例: Standards模式示例: 理解: Quirks模式: Standards模式: 高质量讨论: 前言: "Quirks模式"和"Standards模式"是与HTML文档渲染模式相关的两种模式。它们影响着浏览器如何解释和渲染HT…...
自然语言处理---Transformer模型
Transformer概述 相比LSTM和GRU模型,Transformer模型有两个显著的优势: Transformer能够利用分布式GPU进行并行训练,提升模型训练效率。 在分析预测更长的文本时,捕捉间隔较长的语义关联效果更好。 Transformer模型的作用 基于seq…...
动画系统的前世今生(一)
掐指一算,五年没更新过我的CSDN账号啦,方向也从人工智能变成了计算机图形学,当然也依旧会关注AI的发展,之前在知乎上写了一些文章[传送门],后续也会逐渐同步到CSDN上~ 这个系列将包含五篇文章,内…...
11 结构型模式- 代理模式
结构性模式一共包括七种: 代理模式、桥接模式、装饰者模式、适配器模式、门面(外观)模式、组合模式、和享元模式。 1 代理模式介绍 软件开发中的代理: 代理模式中引入了一个新的代理对象,代理对象在客户端对象和目标对象之间起到了中介的作用,它去掉客…...
Unity--用户界面
目录 “使用工具栏”: “层次结构”窗口: 层次结构窗口 制作子GameObject “游戏”视图: “场景视图“: ”项目窗口“: 项目窗口工具栏: "Inspector" 窗口: Inspector 游戏…...
BUUCTF 乌镇峰会种图 1
BUUCTF:https://buuoj.cn/challenges 题目描述: 乌镇互联网大会召开了,各国巨头汇聚一堂,他们的照片里隐藏着什么信息呢?(答案格式:flag{答案},只需提交答案࿰…...
Runner GoUI自动化测试发布
构建自动化测试体系是当下每个项目团队愿意去做的,自动化测试减少重复操作节省人力成本。 RunnerGo UI自动化平台 RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块,覆盖了整个产品测试周期。 RunnerGo UI自动化基于Selen…...
【Gensim概念】03/3 NLP玩转 word2vec
第三部分 对象函数 八 word2vec对象函数 该对象本质上包含单词和嵌入之间的映射。训练后,可以直接使用它以各种方式查询这些嵌入。有关示例,请参阅模块级别文档字符串。 类型 KeyedVectors 1) add_lifecycle_event(event_name, log_level2…...
【网络协议】聊聊网络路由相关算法
如何配置路由 路由器是一台网络设备,多张网卡,当一个入口的网络包到达路由器时,会根据本地的信息库决定如何正确的转发流量,通常称为路由表 路由表主要包含如下 核心思想是根据目的 IP 地址来配置路由 目的网络:要去…...
Python 深度学习入门之CNN
CNN 前言一、CNN简介1、简介2、结构 二、CNN简介1、输出层2、卷积层3、池化层4、全连接层5、输出层 前言 1024快乐!1024快乐!今天开新坑,学点深度学习相关的,说下比较火的CNN。 一、CNN简介 1、简介 CNN的全称是Convolutiona…...
国产开发板上打造开源ThingsBoard工业网关--基于米尔芯驰MYD-JD9X开发板
本篇测评由面包板论坛的优秀测评者“JerryZhen”提供。 本文将介绍基于米尔电子MYD-JD9X开发板打造成开源的Thingsboard网关。 Thingsboard网关是一个开源的软件网关,采用python作为开发语言,可以部署在任何支持 python 运行环境的主机上,灵…...
英语——语法——从句——名词性从句——笔记
文章目录 名词性从句一、定义二、分类(一)宾语从句(二)主语从句(三)C同位语从句(四)D表语从句 名词性从句 一、句子成分 简而言之,构成一个句子的成分(或要素…...
PROSTATEx-2 上前列腺癌的 3D CNN 分类
内容 本文介绍了在多参数 MRI 序列上使用 3D CNN 对前列腺癌进行显着性或不显着性分类。内容如下: 数据集描述Dicom 到 Nifti 文件格式的转换不同 MRI 序列的联合配准...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
