当前位置: 首页 > news >正文

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中的绑定知识详解(含案例源码分享)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

【JVM】类的生命周期

【JVM】类的生命周期 文章目录 【JVM】类的生命周期1. 生命周期概述2. 加载阶段3. 连接阶段3.1 验证3.2 准备3.3 解析 4. 初始化阶段4.1 触发初始化的方式4.2 clinit不存在的情况4.3 多个类的初始化 5. 总结 1. 生命周期概述 类的生命周期分为5/7个阶段&#xff1a; 加载(Loa…...

asp.net网上商城系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio协同过滤设计

一、源码特点 asp.net网上商城系统是一套完善的web设计管理系统系统采用协同过滤算法进行商品推荐&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库 为sqlserver2008&#xff0c;使用c#语言开发 ASP…...

APUS入驻百度灵境矩阵,普惠AI大模型插件能力

10月17日&#xff0c;APUS出席百度世界大会2023。会上&#xff0c;百度公布了灵境矩阵业务进展&#xff0c;APUS作为灵境矩阵首批合作伙伴正与百度携手拓展大模型能力边界、构建大模型应用生态。 百度认为&#xff0c;大模型将繁荣AI应用生态&#xff0c;在生态搭建过程中&…...

通过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. 优化 原题链接&#xff1a; 3. 完全背包问题 - AcWing题库 题目描述&#xff1a; 有 N 种物品和一个容量是 V 的背包&#xff0c;每种物品都有无限件可用。 第 i 种物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些…...

J2EE的N层体系结构

J2EE平台采用了多层分布式应用程序模型&#xff0c;实现不同逻辑功能的应用程序被封装到不同的构件中&#xff0c;处于不同层次的构件可被分别部署到不同的机器中。 RMI/IIOP&#xff1a;RMI&#xff08;Remote Method Invocation&#xff0c;远程方法调用&#xff09;是Java的…...

Quirks(怪癖)模式是什么?它和 Standards(标准)模式有什么区别?

目录 前言: 用法: 代码: Quirks模式示例: Standards模式示例: 理解: Quirks模式&#xff1a; Standards模式&#xff1a; 高质量讨论: 前言: "Quirks模式"和"Standards模式"是与HTML文档渲染模式相关的两种模式。它们影响着浏览器如何解释和渲染HT…...

自然语言处理---Transformer模型

Transformer概述 相比LSTM和GRU模型&#xff0c;Transformer模型有两个显著的优势&#xff1a; Transformer能够利用分布式GPU进行并行训练&#xff0c;提升模型训练效率。 在分析预测更长的文本时&#xff0c;捕捉间隔较长的语义关联效果更好。 Transformer模型的作用 基于seq…...

动画系统的前世今生(一)

掐指一算&#xff0c;五年没更新过我的CSDN账号啦&#xff0c;方向也从人工智能变成了计算机图形学&#xff0c;当然也依旧会关注AI的发展&#xff0c;之前在知乎上写了一些文章[传送门]&#xff0c;后续也会逐渐同步到CSDN上&#xff5e; 这个系列将包含五篇文章&#xff0c;内…...

11 结构型模式- 代理模式

结构性模式一共包括七种&#xff1a; 代理模式、桥接模式、装饰者模式、适配器模式、门面(外观)模式、组合模式、和享元模式。 1 代理模式介绍 软件开发中的代理&#xff1a; 代理模式中引入了一个新的代理对象,代理对象在客户端对象和目标对象之间起到了中介的作用,它去掉客…...

Unity--用户界面

目录 “使用工具栏”&#xff1a; “层次结构”窗口&#xff1a; 层次结构窗口 制作子GameObject “游戏”视图&#xff1a; “场景视图“&#xff1a; ”项目窗口“&#xff1a; 项目窗口工具栏&#xff1a; "Inspector" 窗口&#xff1a; Inspector 游戏…...

BUUCTF 乌镇峰会种图 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 乌镇互联网大会召开了&#xff0c;各国巨头汇聚一堂&#xff0c;他们的照片里隐藏着什么信息呢&#xff1f;&#xff08;答案格式&#xff1a;flag&#xff5b;答案&#xff5d;&#xff0c;只需提交答案&#xff0…...

Runner GoUI自动化测试发布

构建自动化测试体系是当下每个项目团队愿意去做的&#xff0c;自动化测试减少重复操作节省人力成本。 RunnerGo UI自动化平台 RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块&#xff0c;覆盖了整个产品测试周期。 RunnerGo UI自动化基于Selen…...

【Gensim概念】03/3 NLP玩转 word2vec

第三部分 对象函数 八 word2vec对象函数 该对象本质上包含单词和嵌入之间的映射。训练后&#xff0c;可以直接使用它以各种方式查询这些嵌入。有关示例&#xff0c;请参阅模块级别文档字符串。 类型 KeyedVectors 1&#xff09; add_lifecycle_event(event_name, log_level2…...

【网络协议】聊聊网络路由相关算法

如何配置路由 路由器是一台网络设备&#xff0c;多张网卡&#xff0c;当一个入口的网络包到达路由器时&#xff0c;会根据本地的信息库决定如何正确的转发流量&#xff0c;通常称为路由表 路由表主要包含如下 核心思想是根据目的 IP 地址来配置路由 目的网络&#xff1a;要去…...

Python 深度学习入门之CNN

CNN 前言一、CNN简介1、简介2、结构 二、CNN简介1、输出层2、卷积层3、池化层4、全连接层5、输出层 前言 1024快乐&#xff01;1024快乐&#xff01;今天开新坑&#xff0c;学点深度学习相关的&#xff0c;说下比较火的CNN。 一、CNN简介 1、简介 CNN的全称是Convolutiona…...

国产开发板上打造开源ThingsBoard工业网关--基于米尔芯驰MYD-JD9X开发板

本篇测评由面包板论坛的优秀测评者“JerryZhen”提供。 本文将介绍基于米尔电子MYD-JD9X开发板打造成开源的Thingsboard网关。 Thingsboard网关是一个开源的软件网关&#xff0c;采用python作为开发语言&#xff0c;可以部署在任何支持 python 运行环境的主机上&#xff0c;灵…...

英语——语法——从句——名词性从句——笔记

文章目录 名词性从句一、定义二、分类&#xff08;一&#xff09;宾语从句&#xff08;二&#xff09;主语从句&#xff08;三&#xff09;C同位语从句&#xff08;四&#xff09;D表语从句 名词性从句 一、句子成分 简而言之&#xff0c;构成一个句子的成分&#xff08;或要素…...

PROSTATEx-2 上前列腺癌的 3D CNN 分类

内容 本文介绍了在多参数 MRI 序列上使用 3D CNN 对前列腺癌进行显着性或不显着性分类。内容如下: 数据集描述Dicom 到 Nifti 文件格式的转换不同 MRI 序列的联合配准...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...