WPF 基础入门 (Binding 一)

1 通知机制

    WPF 中Binding可以比作数据的桥梁,桥梁的两端分别是Binding的源(Source)和目标(Target)。一般情况下,Binding源是逻辑层对象,Binding目标是UI层的控件对象,这样,数据就会通过Binding送达UI层,被UI层展现。后台数据变更后,如何通知到UI层,并更新显示,则通过INotifyPropertyChanged接口实现。

public class BaseNotifyProperty:INotifyPropertyChanged
{public event PropertyChangedEventHandler PropertyChanged;public void OnPropertyChanged(string propertyName=""){if (PropertyChanged != null)PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}public string DirFullName
{get { return m_DirFullName; }set { m_DirFullName = value; OnPropertyChanged("DirFullName"); }
}

2 Binding实现

2.1 绑定(Binding)

    现在我有一个Slider和一个Textbox。我希望在滑动Slider的时候,Textbox实时显示Slider的Value属性的值。该怎么办呢?

    XAML代码如下:

<StackPanel><TextBox x:Name="t1" Text="{Binding Path=Value, ElementName=s1,Mode=TwoWay}"/><Slider x:Name="s1" Minimum="0" Maximum="100" />
</StackPanel>

    与上述等价的C#代码为:

t1.SetBinding(TextBox.TextProperty, new Binding("Value") { ElementName = "s1" });

    还可以这样写:

Binding binding = new Binding();
binding.Path = new PropertyPath("Value");
binding.Source = s1;
t1.SetBinding(TextBox.TextProperty, binding);

2.2  多重绑定(MultiBinding)

    MultiBinding多个数据源进行组合绑定

<TextBlock><TextBlock.Text><MultiBinding StringFormat="{}{0} + {1}"><Binding Path="Name" /><Binding Path="ID" /></MultiBinding></TextBlock.Text>
</TextBlock>

3 绑定转换器

    在某种使用场景中,需要对Binding的对象进行转换,如Bool转Visibility,DateTime转String等。

WPF提供了两种Converter接口,单值转换的接口IValueConverter和多值转换的接口IMultiValueConverter,它们都属于System.Windows.Data命名空间,在程序集PresentationFramework.dll中。这两种值转换器都是分区域性的。其中方法ConvertConvertBack都具有指示区域性信息的culture参数。如果区域性信息与转换无关,那么在自定义转换器中可以忽略该参数。

public class ProgressValueToAngleConverter : IValueConverter
{public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){if (value != null){     double prec=(double)value;if(prec<0||prec>100)prec=0;return 3.6 *prec;}return 0;}}public class MultiBindingStringFormatConverter:IMultiValueConverter
{public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture){   object result = null;if (values != null){  var item=values.Last();if (item != null){string str = item.ToString();result = (object)System.String.Format(str, values);}else{result = values[0].ToString();}}return result;}
}

5.4 格式化(StringFormat)

•	货币格式
<TextBlock Text="{Binding Price, StringFormat={}{0:C}}" />
输出:$123.46
•	货币格式,一位小数
<TextBox Text="{Binding Price, StringFormat={}{0:C1}}" />
输出: $123.5
•	前文字
<TextBox Text="{Binding Price, StringFormat=单价:{0:C}}" /> 
单价:$123.46
•	后文字
<TextBox Text="{Binding Price, StringFormat={}{0}元}" /> 
输出: 123.45678元
•	固定的位数,位数不能少于未格式化前,仅支持整形
<TextBox Text="{Binding Count, StringFormat={}{0:D6}}" /> 
输出: 086723
•	指定小数点后的位数
<TextBox Text="{Binding Total, StringFormat={}{0:F4}}" /> 
输出:28768234.9329
•	用分号隔开的数字,并指定小数点后的位数
<TextBox Text="{Binding Total, StringFormat={}{0:N3}}" />
输出:28,768,234.933
•	格式化百分比
<TextBox Text="{Binding Persent, StringFormat={}{0:P1}}" /> 
输出: 78.9 %
•	占位符
<TextBox Text="{Binding Price, StringFormat={}{0:0000.00}}" /> 
输出: 0123.46
<TextBox Text="{Binding Price, StringFormat={}{0:####.##}}" /> 
输出: 123.46
•	日期/时间
<TextBox Text="{Binding DateTimeNow, StringFormat={}{0:d}}" /> 
输出: 5/4/2015
<TextBox Text="{Binding DateTimeNow, StringFormat={}{0:D}}" /> 
输出: Monday, May 04, 2015
<TextBox Text="{Binding DateTimeNow, StringFormat={}{0:f}}" /> 
输出: Monday, May 04, 2015 5:46 PM
<TextBox Text="{Binding DateTimeNow, StringFormat={}{0:F}}" />
输出: Monday, May 04, 2015 5:46:56 PM
<TextBox Text="{Binding DateTimeNow, StringFormat={}{0:g}}" />
输出: 5/4/2015 5:46 PM
<TextBox Text="{Binding DateTimeNow, StringFormat={}{0:G}}" />
输出: 5/4/2015 5:46:56 PM
<TextBox Text="{Binding DateTimeNow, StringFormat={}{0:m}}" /> 
输出: May 04
<TextBox Text="{Binding DateTimeNow, StringFormat={}{0:M}}" />
输出: May 04
<TextBox Text="{Binding DateTimeNow, StringFormat={}{0:t}}" /> 
输出: 5:46 PM
<TextBox Text="{Binding DateTimeNow, StringFormat={}{0:T}}" /> 
输出: 5:46:56 PM
<TextBox Text="{Binding DateTimeNow, StringFormat={}{0:yyyy年MM月dd日}}" /> 
输出: 2015年05月04日
<TextBox Text="{Binding DateTimeNow, StringFormat={}{0:yyyy-MM-dd}}" />输出: 2015-05-04
<TextBox Text="{Binding DateTimeNow, StringFormat={}{0:yyyy-MM-dd HH:mm}}" /> 
输出: 2015-05-04 17:46
<TextBox Text="{Binding DateTimeNow, StringFormat={}{0:yyyy-MM-dd HH:mm:ss}}" />
输出: 2015-05-04 17:46:56
•	多重绑定
<TextBox.Text>
<MultiBinding StringFormat="姓名:{0}{1}">
<Binding Path="FristName" />
<Binding Path="LastName" />
</MultiBinding>
</TextBox.Text>
输出: 姓名:AAbb

**************************************************************************************************************

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

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

相关文章

概念解析 | Shapley值及其在深度学习中的应用

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:Shapley值及其在深度学习中的应用。 1 背景介绍 在机器学习和数据分析中,理解模型的预测是非常重要的。尤其是在深度学习黑盒模型中,我们往往难以直观地理解模型的预测行为。为…

软件测试/测试开发丨接口测试之Postman 安装与使用

Postman 安装 官网下载地址 www.postman.com/downloads Postman 使用 发送get请求 新建请求 填写请求方式&#xff1a;GET 填写请求 URL&#xff1a; ceshiren.com/httpbin.ceshiren.com/get 填写请求参数&#xff1a; para_key para_value 发送 POST 请求 请求方式&…

1. Spring概述

概述 Spring 是一个开源框架Spring 为简化企业级开发而生&#xff0c;使用 Spring&#xff0c;JavaBean 就可以实现很多以前要靠 EJB 才能实现的功能。同样的功能&#xff0c;在 EJB 中要通过繁琐的配置和复杂的代码才能够实现&#xff0c;而在 Spring 中却非常的优雅和简洁。…

2023年总结(2023年1月1日至2023年12月31日)

前言 时间过得真快啊&#xff0c;一年又过去了。 从去年11月换了家公司后&#xff0c;工作就稳定多了&#xff0c;做的工作也是我喜欢做的工作——摄像头驱动&#xff0c;平时也挺轻松的&#xff0c;偶尔有事儿的时候会压力大点&#xff0c;加点班&#xff0c;其他都还好&…

4年微博热搜数据,一次拿走

又是新的一年了&#xff0c;从2020年开始&#xff0c;就养成了定时备份各大平台热搜数据的习惯&#xff0c;微博&#xff0c;知乎都在备份&#xff0c;今天给大家看一下从2020年到2023年的微博热搜数据情况 这是2022年的备份数据&#xff0c;每天的热搜数据一个文件&#xff0c…

2.2 设计FMEA步骤二:结构分析

2.2.1 目的 设计结构分析的目的是将设计识别和分解为系统、子系统、组件和零件,以便进行技术风险分析。其主要目标包括: 可视化分析范围结构化表示:方块图、边界图、数字模型、实体零件识别设计接口、交互作用和间隙促进顾客和供应商工程团队之间的协作(接口责任)为功能分…

计算机组成原理——中央处理器cpu21-40

18、某计算机的指令流水线由4个功能段组成&#xff0c;指令流经各功能段的时间&#xff08;忽略各功能段之间的缓存时间&#xff09;分别为90ns、80ns、70ns和60ns&#xff0c;则该计算机的CPU时钟周期至少是多少。A A、 90ns     B、 80ns C、 70ns     D、 60ns …

修改docker镜像IP

1.创建网络 docker network create --driver bridge --subnet 100.168.0.0/24 my_network2.修改docker-compose启动文件 version: "2" services:situation-awareness-web:restart: alwaysimage: situation-awareness-web:0.1.0container_name: situation-awareness…

【日常聊聊】解决深度学习模型挑战:解释性与鲁棒性的平衡

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 1. 数据偏见&#xff1a; 介绍和解释&#xff1a; 解决方法&#xff1a; 2. 复制训练数据&#xff1a; 介绍和解决方法&am…

git 查看最新commit提交时间(具体到时分秒)

git 查看最新commit提交时间 使用服务器时间 以及如何自定义显示格式 使用服务器时间查看最新提交时间&#xff1a; 可以使用 git log 命令来查看最新提交的时间&#xff0c;该时间默认显示为作者提交时间。 $ git log -1 --format"%cd"如果想查看提交者提交时间&a…

【形式语言与自动机/编译原理】CFG-->Greibach-->NPDA(2)

本文将详细讲解《形式语言与自动机》&#xff08;研究生课程&#xff09;或《编译原理》&#xff08;本科生课程&#xff09;中的上下文无关文法&#xff08;CFG&#xff09;转换成Greibach范式&#xff0c;再转成下推自动机&#xff08;NPDA&#xff09;识别语言是否可以被接受…

堆的应用:堆排序和TOP-K问题

上次才讲完堆的相关问题&#xff1a;二叉树顺序结构与堆的概念及性质&#xff08;c语言实现堆 那今天就接着来进行堆的主要两方面的应用&#xff1a;堆排序和TOP-K问题 文章目录 1.堆排序1.1概念、思路及代码1.2改良代码&#xff08;最初建立大堆用AdjustDow&#xff09; 2. TO…

软件体系架构复习二

呃&#xff0c;前面复习的忘了发了。从后面开始吧 Unit 11--18 复习Tips&#xff1a; 重点在于对概念的理解&#xff0c;概念间关系的理解。 对具体的识别方法&#xff0c;处理方法等根据自己的兴趣做一些了解即可 。 如&#xff1a;关于 软件架构脆弱性的成因 &#xff0c; …

企业建设网络安全的几种“降本增效”的思考

文章目录 前言一、基于风险的安全策略,优先保护关键资产二、集中化安全管理三、加强安全意识培训,打造人肉防火墙四、安全自动化运营五、定期更新和打补丁六、安全服务外包七、跟踪关键安全运营指标并展示安全投资回报率八、打造战略情报网络总结前言 在当下的经济寒冬中,网…

【AIGC-图片生成视频系列-5】I2V-Adapter:一种用于视频扩散模型的通用图像生成视频适配器

目录 一. 项目与贡献概述 二. 方法详解 a. 整体框架图 b. 帧相似性先验 三. 一般化图像生成动画结果 四. 基于个性化 T2I 模型的动画结果 五. 结合ControlNet动画结果 六. 项目论文和代码 七. 个人思考与总结 在快速发展的数字内容生成领域&#xff0c;焦点已从文本到…

YOLO手部目标检测

手部目标检测原文地址如下&#xff1a;手部关键点检测2&#xff1a;YOLOv5实现手部检测(含训练代码和数据集)_yolov5 关键点检测-CSDN博客 手部检测数据集地址如下&#xff1a; 手部关键点检测1&#xff1a;手部关键点(手部姿势估计)数据集(含下载链接)_手关键点数据集-CSDN博…

Feign远程调用丢失请求头问题处理--异步任务执行远程请求线程丢失请求属性问题处理

在关于Feign远程调用丢失请求头问题处理中解决了远程调用发送请求丢失老请求中请求头的问题。A方法接收浏览器中的请求&#xff0c;B方法是A方法中嵌套方法用来发送Feign远程调用。如果B方法是在异步任务CompletableFuture.runAsync(()->{},Executor)中执行并启用线程池分配…

1.4 FMEA概述

FMEA适用场景 FMEA在三种基本情形下使用,每种情形都有不同的范围或重点。 情形1:新设计、新技术或新过程 FMEA的范围包括完整的设计、技术或过程。情形2:现有设计或过程的新应用 FMEA的范围包含新环境、新场地、新应用或使用概况(包括工作周期、法规要求等)下的现有设计…

94. 二叉树的中序遍历(“颜色标记法”)

我的做法&#xff1a;递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode ri…

Linux:apache优化(7)—— 日志分割|日志合并

作用&#xff1a;随着网站访问量的增加&#xff0c;访问日志中的信息会越来越多&#xff0c; Apache 默认访问日志access_log单个文件会越来越大&#xff0c;日志文件体积越大&#xff0c;信息都在一个文件中&#xff0c;查看及分析信息会及不方便。 分割 实现方式&#xff1a…