WPF入门教学十二 数据绑定进阶

在WPF中,数据绑定是一种强大的机制,它允许UI元素与数据源之间自动同步。进阶的数据绑定技巧可以帮助你创建更加复杂和功能丰富的应用程序。以下是一些进阶数据绑定的技巧和最佳实践:

数据绑定到方法

数据绑定不仅可以绑定到对象的属性,还可以绑定到对象的方法。例如,如果你有一个方法需要两个参数,你可以创建一个ObjectDataProvider来包装这个方法,并通过Binding将其绑定到UI元素上。

数据共享

在多视图或多视图模型的情况下,数据共享是一个常见的需求。WPF提供了几种实现数据共享的方法,如使用Application.Current.Properties、事件、委托、消息机制或单例类。

数据验证

WPF提供了数据验证功能,可以通过实现INotifyDataErrorInfoIDataErrorInfo接口来实现数据验证。这允许你在用户输入时提供即时反馈,确保数据的合法性。

MVVM模式中的数据绑定

在MVVM(Model-View-ViewModel)模式中,数据绑定发挥着至关重要的作用。通过将UI与数据逻辑分离,可以创建更加灵活和可维护的应用程序。确保数据模型实现了INotifyPropertyChanged接口,以便数据的变化能够实时地反映在界面上。

进阶示例

数据绑定到方法示例

假设我们有一个Calculator类,其中包含一个加法方法:

 
public class Calculator
{public int Add(int a, int b){return a + b;}
}

我们可以使用ObjectDataProvider来包装这个方法,并通过Binding将其绑定到UI元素上:

 
<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfApp"Title="MainWindow" Height="350" Width="525"><Window.Resources><ObjectDataProvider x:Key="CalculatorProvider" ObjectType="{x:Type local:Calculator}" MethodName="Add"><ObjectDataProvider.MethodParameters><system:Int32>10</system:Int32><system:Int32>20</system:Int32></ObjectDataProvider.MethodParameters></ObjectDataProvider></Window.Resources><Grid><TextBox Text="{Binding Source={StaticResource CalculatorProvider}, Path=Result}"/></Grid>
</Window>
数据验证示例

假设我们有一个Person类,其中包含一个Name属性,我们需要确保这个属性不为空:

 
public class Person : INotifyPropertyChanged, IDataErrorInfo
{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));}public string Error => null;public string this[string columnName]{get{string error = null;if (columnName == nameof(Name)){if (string.IsNullOrEmpty(Name)){error = "Name cannot be empty.";}}return error;}}
}

在XAML中绑定一个TextBox到Person对象的Name属性,并启用验证:

 
<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfApp"Title="MainWindow" Height="350" Width="525"><Window.DataContext><local:Person/></Window.DataContext><Grid><TextBox Text="{Binding Name, ValidatesOnDataErrors=True}"><TextBox.Style><Style TargetType="TextBox"><Style.Triggers><Trigger Property="Validation.HasError" Value="True"><Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/><Setter Property="BorderBrush" Value="Red"/></Trigger></Style.Triggers></Style></TextBox.Style></TextBox></Grid>
</Window>
MVVM模式中的数据绑定示例

假设我们有一个PersonViewModel类,其中包含一个Person对象和一个SaveCommand

 
public class PersonViewModel : INotifyPropertyChanged
{private Person _person;public Person Person{get { return _person; }set{if (_person != value){_person = value;OnPropertyChanged(nameof(Person));}}}public ICommand SaveCommand { get; }public PersonViewModel(){Person = new Person();SaveCommand = new RelayCommand(Save);}private void Save(){// Save logic here}public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}

在XAML中绑定一个TextBox到PersonViewModel对象的Person.Name属性,并绑定一个Button到SaveCommand

 

<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfApp"Title="MainWindow" Height="350" Width="525"><Window.DataContext><local:PersonViewModel/></Window.DataContext><Grid><TextBox Text="{Binding Person.Name, UpdateSourceTrigger=PropertyChanged}"/><Button Content="Save" Command="{Binding SaveCommand}"/></Grid>
</Window>

通过掌握这些进阶技巧和最佳实践,你可以更有效地使用WPF的数据绑定功能,创建出更加复杂和功能丰富的应用程序。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

「C++系列」动态内存

【人工智能教程】&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站&#xff1a;【人工智能教程】 文章目录 一、动态内存1. 使用new和delete①分配单个对象②分配对象数组 2. …

python全栈学习记录(十七)logging、json与pickle、time与datatime、random

logging、json与pickle、time与datatime、random 文章目录 logging、json与pickle、time与datatime、random一、logging二.json与pickle三.time与datatime四.random 一、logging logging模块用来记录日志信息。 import logging # 进行基本的日志配置 logging.basicConfig( fi…

图文深入理解SQL语句的执行过程

List item 本文将深入介绍SQL语句的执行过程。 一.在RDBMS&#xff08;关系型DB&#xff09;中&#xff0c;看似很简单的一条已写入DB内存的SQL语句执行过程却非常复杂&#xff0c;也就是说&#xff0c;你执行了一条诸如select count(*) where id 001 from table_name的非常简…

[WMCTF2020]Make PHP Great Again 2.01

又是php代码审计,开始吧. 这不用审吧&#xff0c;啊喂. 意思就是我们要利用require_once()函数和传入的file的value去读取flag的内容.&#xff0c;貌似呢require_once()已经被用过一次了&#xff0c;直接读取还不行&#xff0c;看一下下面的知识点. require_once() require…

WebLogic 漏洞复现

1、后台弱⼝令GetShell 默认账号密码&#xff1a;weblogic/Oracle123 weblogic常⽤弱⼝令&#xff1a;https://cirt.net/passwords?criteriaweblogic 这⾥注意&#xff0c; 单个账号错误密码5次之后就会⾃动锁定。 http://47.121.212.195:7001/console 2、登录后台后&#…

恒生科指八连涨,汽车股强势

9月20日电 周五&#xff0c;港股三大股指集体收涨。恒生指数涨1.36%报18258.57点&#xff0c;连续第六个交易日上涨&#xff1b;恒生科技指数涨1.43%报3703.84点&#xff0c;连续第八个交易日上涨&#xff0c;创逾两个月来新高&#xff1b;恒生中国企业指数涨1.21%报6381.5点&a…

项目扩展五:交互式:command-line interface版本的实现

项目扩展五&#xff1a;command-line interface版本的实现 一、CLI交互的设计1.为何要设计这个CLI交互2.具体设计1.启动服务2.选择信道3.选择虚拟机4.正式业务注意&#xff1a;1.消费者与生产者跟信道的关系2.消息处理回调函数的问题3.消息确认的问题 5.其他功能1.打印功能2.查…

STM32精确控制步进电机

目的&#xff1a;学习使用STM32电机驱动器步进电机&#xff0c;进行电机运动精确控制。 测试环境&#xff1a; MCU主控芯片STM32F103RCT6 &#xff1b;A4988步进电机驱动器模块&#xff1b;微型2相4线步进电机10mm丝杆滑台&#xff0c;金属丝杆安装有滑块。 10mm二相四线微型…

机器学习之非监督学习(二)异常检测(基于高斯概率密度)

机器学习之非监督学习&#xff08;二&#xff09;异常检测&#xff08;基于高斯概率密度&#xff09; 0. 文章传送1.案例引入2.高斯正态分布3.异常检测算法4.异常检测 vs 监督学习5.算法优化6.代码实现 0. 文章传送 机器学习之监督学习&#xff08;一&#xff09;线性回归、多…

C语言中数组和字符串的联系

一、C语言中&#xff0c;数组和字符串 1、C语言中&#xff0c;定义一个数组后&#xff0c;数组名保存的是这个数组的首地址。类似一个指向数组第一个元素的指针&#xff0c;但是这个指针不能重新指向。2、字符串在C语言中是通过字符数组来实现的&#xff0c;也就是说字符串还是…

【小沐学CAD】3ds Max常见操作汇总

文章目录 1、简介2、二次开发2.1 C 和 3ds Max C SDK2.2 NET 和 3ds Max .NET API2.3 3ds Max 中的 Python 脚本2.4 3ds Max 中的 MAXScript 脚本 3、快捷键3.1 3Dmax键快捷键命令——按字母排序3.2 3dmax快捷键命令——数字键3.3 3dmax功能键快捷键命令3.4 3Dmax常用快捷键——…

Elasticsearch 完整格式的 URL 进行分词,有什么好的解决方案吗?

1、问题描述 我想对完整格式的 url 进行分词&#xff0c;请问有什么好的解决方案吗&#xff1f; 比如&#xff1a;https://www.abc.com/any/path?param_1some&param-2other#title 看了官方的分词器&#xff0c;感觉没啥合适的? 预处理的话&#xff0c;又不知道该怎么处理…

Unity对象池的高级写法 (Plus优化版)

唐老师关于对物体分类的OOD的写法确实十分好&#xff0c;代码也耦合度也低&#xff0c;但是我有个简单的写法同样能实现一样的效果&#xff0c;所以我就充分发挥了一下主观能动性 相较于基本功能&#xff0c;这一版做出了如下改动 1.限制了对象池最大数量&#xff0c;多出来的…

C++11 可变的模板参数

前言 本期我们接着继续介绍C11的新特性&#xff0c;本期我们介绍的这个新特性是很多人都感觉抽象的语法&#xff01;它就是可变的模板参数&#xff01; 目录 前言 一、可变的模板参数 1.1可变的参数列表 1.2可变的参数包 1.3可变参数包的解析 • 递归展开解析 • 逗号…

微服务Docker相关指令

1、拉取容器到镜像仓库 docker pull xxx //拉取指令到 镜像仓库 例如 docker pull mysql 、docker pull nginx docker images //查看镜像仓库 2、删除资源 2.1、删除镜像仓库中的资源 docker rmi mysql:latest //删除方式一&#xff1a;格式 docker rmi 要…

【解密 Kotlin 扩展函数】扩展函数的创建(十六)

导读大纲 1.1 为第三方的类添加方法: 扩展函数 1.1 为第三方的类添加方法: 扩展函数 Kotlin 的主题之一是与现有代码的平滑集成 即使是纯 Kotlin 项目,也是构建在 Java 库之上的 如 JDK、Android 框架和其他第三方框架 而当你将 Kotlin 集成到 Java 项目中时 你还要处理尚未或不…

python爬虫:将知乎专栏文章转为pdf

欢迎关注本人的知乎主页~ 实现思路 用户输入专栏ID&#xff1a; 代码首先提示用户输入一个知乎专栏的ID&#xff0c;默认值为 c_1747690982282477569。输入的ID用于构建API请求的URL。 发送HTTP请求&#xff1a; 使用 requests.get() 向知乎API发送GET请求&#xff0c;获取指定…

【QGIS入门实战精品教程】6.1:QGIS根据属性条件查询数据(SQL表达式)

文章目录 一、字段过滤二、高级过滤(表达式)一、字段过滤 对于单个字段的查询,可以采用字段过滤,例如,从县区数据中,根据NAME字段,查找出县级市玉门市。操作为:右键县区→打开属性表: 点击左下角,选择name字段。 输入玉门市,回车,选择查找除的属性表记录,此时图斑…

【Linux】入门【更详细,带实操】

Linux全套讲解系列&#xff0c;参考视频-B站韩顺平&#xff0c;本文的讲解更为详细 目录 1、课程内容 2、应用领域 3、概述 4、 Linux和Unix 5、VMware15.5和CentOS7.6安装 6、网络连接三种方式 7、虚拟机克隆 8、虚拟机快照 9、虚拟机迁移删除 10、vmtools 11、目录…

set-ExecutionPolicy RemoteSigned 提示不是内部或外部命令,也不是可运行的程序或批处理文件

这个错误一般发生在使用命令提示符或者PowerShell窗口中找不到set-ExecutionPolicy RemoteSigned。如果你想在命令提示符或者PowerShell窗口运行set-ExecutionPolicy RemoteSigned&#xff0c;你需要搜索打开Window PowerShell ISE&#xff0c;并以管理员身份打开&#xff0c;输…