C# WPF编程-元素绑定

C# WPF编程-元素绑定

  • 将元素绑定到一起
    • 绑定表达式
    • 绑定错误
    • 绑定模式
    • 代码创建绑定
    • 移除绑定
    • 使用代码检索绑定
    • 多绑定
    • 绑定更新
    • 绑定延时

数据绑定是一种关系,该关系告诉WPF从源对象提取一下信息,并用这些信息设置目标对象的属性。目标属性始终是依赖项属性,通常位于WPF元素中,WPF数据绑定的最终目标是在用户界面中显示一下信息。

将元素绑定到一起

数据绑定的最简单情形是,源对象是WPF元素而且源属性是依赖项属性。依赖项属性具有内置的更改通知支持。当源对象中改变属性值时会立即更新目标对象中的绑定属性。

简单示例,通过Slider控制TextBlock文本字体大小:

    <StackPanel><Slider x:Name="sliderFontSize" Margin="3" Minimum="1" Maximum="40" Value="10"TickFrequency="1" TickPlacement="TopLeft"></Slider><TextBlock x:Name="textBlock" Margin="10" Text="简单文本内容"FontSize="{Binding ElementName=sliderFontSize, Path=Value}"></TextBlock></StackPanel>

在这里插入图片描述

绑定表达式

  • 数据绑定表达式使用XAML标记扩展。因为正在创建System.Windows.Data.Binding类的一个实例,所以绑定表达式以单词Binding开头。至少需要设置两个属性:ElementName属性(指示源元素)和Path属性(指示源元素中的属性)。
  • 如果希望引用附加属性(在另一个类中定义但应用于绑定元素的属性),需要再圆括号中封装属性名称。如,绑定到Grid控件中的某个元素,路径(Grid.Row)将检索放置元素的行号。

绑定错误

WPF不会引发异常来通知与数据绑定相关的问题。如果指定元素或属性不存在,那么不会收到任何指示;

绑定模式

数据绑定的一个特性是目标会被自动更新,而不考虑源的修改方式。

BindingMode枚举值

名称说明
OneWay当源属性变化时更新目标属性
TwoWay当源属性变化时更新目标属性,并且当目标属性变化时更新源属性
OneTime最初根据源属性值设置目标属性。
OneWayToSource与OnWay类型类似,但方向相反。当目标属性变化时更新源属性。
Default此类绑定依赖于目标属性。既可以是双向的,也可以是单向的。除非明确指定了另一种模式,否则所有绑定都使用该方法

在这里插入图片描述

示例,双向绑定模式:

<StackPanel><Slider x:Name="sliderFontSize" Margin="3" Width="500" Minimum="1" Maximum="40" Value="10"TickFrequency="1" TickPlacement="TopLeft"></Slider><TextBlock x:Name="textBlock" Margin="10" Text="简单文本内容"FontSize="{Binding ElementName=sliderFontSize, Path=Value, Mode=TwoWay}"></TextBlock><Button x:Name="smallBtn" Margin="10" Width="100" Click="smallBtn_Click">小字体</Button><Button x:Name="largeBtn" Margin="10" Width="100" Click="largeBtn_Click">大字体</Button>
</StackPanel>
private void smallBtn_Click(object sender, RoutedEventArgs e)
{textBlock.FontSize = 15;
}private void largeBtn_Click(object sender, RoutedEventArgs e)
{textBlock.FontSize = 30;
}

在这里插入图片描述

代码创建绑定

在构建窗口时,在XAML标记中使用Binding标记扩展来声明绑定表达式通常最高效。但也可以使用代码来创建绑定:

示例,代码创建绑定:

Binding binding = new Binding();
binding.Source = sliderFontSize;
binding.Path = new PropertyPath("Value");
binding.Mode = BindingMode.TwoWay;
blockText.SetBinding(TextBlock.FontSize, binding);

移除绑定

可以通过代码使用BindingOperation类的两个静态方法移除绑定。

  • ClearBinding()方法:使用依赖项属性的引用作为参数,删除指定的数据绑定;
  • ClearAllBinding()方法:为元素删除所有数据绑定;

BindingOperation.ClearAllBinding(blockText);

需要使用代码绑定的一些特殊情况:

  • 创建动态绑定
  • 删除绑定

使用代码检索绑定

可使用代码检索绑定并检查其属性,而不必考虑绑定最初是用代码还是标记创建的。
获取绑定信息的两种方式:

  1. 使用静态方法BindingOperations.GetBinding()来检索相应的Binding对象。需要提供两个参数:绑定元素以及具有绑定表达式的属性。
<TextBlock x:Name="textBlock" Margin="10" Text="简单文本内容"FontSize="{Binding ElementName=sliderFontSize, Path=Value"></TextBlock>
Binding binding = BindingOperations.GetBinding(textBlock, TextBlock.FontSize);

一旦获取到绑定对象,就可以检查其属性。如:

  • Binding.ElementName:绑定元素名;
  • Binding.Path:绑定值;
  • BindingMode:绑定模式;
  1. 通过调用BindingOperations.GetBindingExpression()方法获得更实用的BindingExpression对象:
    BindingExpression expression = BindingOperations.GetBingdingExpression(textBlock, TextBlock.FontSize);
	// 获取源元素Slider boundObj = (Slider)expression.ResolvedSource;string boundData = boundObj.FontSize;

多绑定

可以绑定元素的多个属性。

示例:绑定了 TextBlock元素的 FontSize,Text 和 Foreground三个属性

<StackPanel Width="500"><Slider x:Name="sliderFontSize" Minimum="10" Maximum="40" Value="20"></Slider><TextBox x:Name="textInput">请输入内容</TextBox><ListBox x:Name="listboxColor" SelectedIndex="0"><ListBoxItem Foreground="Red">Red</ListBoxItem><ListBoxItem Foreground="Green">Green</ListBoxItem><ListBoxItem Foreground="Blue">Blue</ListBoxItem></ListBox><TextBlock x:Name="textShow" Margin="5"FontSize="{Binding ElementName=sliderFontSize, Path=Value}"Text="{Binding ElementName=textInput, Path=Text}"Foreground="{Binding ElementName=listboxColor, Path=SelectedItem.Foreground}"></TextBlock>
</StackPanel>

在这里插入图片描述

绑定更新

绑定数据的更新行为由Binding.UpdateSourceTrigger属性控制,枚举值有:

名称说明
PropertyChanged当目标属性发生变化时立即更新源
LostFocus当目标属性发生变化并且目标丢失焦点时更新源
Explicit除非调用BindingExpression.UpdateSource()方法,否则无法更新源
Default更加目标属性的元素数据确定更新行为

例如,添加了UpdateSourceTrigger=PropertyChanged

<TextBlock x:Name="textFontSize"Text="{Binding ElementName=textInput, Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBlock>

绑定延时

下极少数情况下,需要防止数据绑定触发操作和修改源对象,至少需要延迟一段时间。这种情况可以使用Binding对象的Delay属性。等待数毫秒,之后再提交更改。

例如:添加了Delay=500

<TextBlock x:Name="textFontSize"Text="{Binding ElementName=textInput, Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,Delay=500}"></TextBlock>

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

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

相关文章

Centos7 elasticsearch-7.7.0 集群搭建,启用x-pack验证 Kibana7.4用户管理

前言 Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎&#xff0c;能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心&#xff0c;它集中存储您的数据&#xff0c;帮助您发现意料之中以及意料之外的情况。 环境准备 软件 …

VSCode - 离线安装扩展python插件教程

1&#xff0c;下载插件 &#xff08;1&#xff09;首先使用浏览器打开 VSCode 插件市场link &#xff08;2&#xff09;进入插件主页&#xff0c;点击右侧的 Download Extension 链接&#xff0c;将离线安装包下载下来&#xff08;文件后缀为 .vsix&#xff09; 2&#xff0c;…

GoogleNet神经网络介绍

一、简介 GoogleNet&#xff0c;也称为GoogLeNet&#xff0c;是谷歌工程师设计的一种深度神经网络结构&#xff0c;它在2014年的ImageNet图像识别挑战赛中取得了冠军。该神经网络的设计特点主要体现在其深度和宽度上&#xff0c;通过引入名为Inception的核心子网络结构&#x…

HarmonyOS NEXT应用开发案例——阻塞事件冒泡

介绍 本示例主要介绍在点击事件中&#xff0c;子组件enabled属性设置为false的时候&#xff0c;如何解决点击子组件模块区域会触发父组件的点击事件问题&#xff1b;以及触摸事件中当子组件触发触摸事件的时候&#xff0c;父组件如果设置触摸事件的话&#xff0c;如何解决父组…

IDEA报错,`java.io.NotSerializableException`,解决:一个类只有实现了Serializable接口,它的对象才是可序列化的

问题&#xff1a;IDEA报错&#xff0c;java.io.NotSerializableException 解决办法&#xff1a;在出问题的类中加上implements Serializable&#xff0c;如下所示&#xff1a; 原因&#xff1a;当要将该实体类对象保存至某个地方时&#xff08;我这里是想将Catalog2Vo保存至R…

小型分布式文件存储系统GoFastDfs应用简介

前言 最近稍微留意了一下各个文件存储系统的协议&#xff0c;发现minio是LGPLV3, 而fastdfs 是GPL3,这些协议其实对于商业应用是一个大坑。故而寻找一些代替品。 go-fastdfs就是其中之一&#xff0c;官网在&#xff1a; go-fastdfs 具体应用 其实可以直接查看官网教程的。 下…

GEE:基于光谱距离方法的变化检测(以滑坡为例)

作者:CSDN @ _养乐多_ 本文将介绍在 Google Earth Engine(GEE)平台上,使用光谱向量距离度量方法进行变化检测的代码。代码中使用哨兵数据的光谱向量,并以检测滑坡为例进行演示。 结果如下图所示, 文章目录 一、参考内容1.1 光谱距离1.2 点积二、代码链接三、完整代码一…

python怎么处理txt

导入文件处理模块 import os 检测路径是否存在&#xff0c;存在则返回True&#xff0c;不存在则返回False os.path.exists("demo.txt") 如果你要创建一个文件并要写入内容 #如果demo.txt文件存在则会覆盖&#xff0c;并且demo.txt文件里面的内容被清空&#xff0c;如…

实现一个Google身份验证代替短信验证

最近才知道公司还在做国外的业务&#xff0c;要实现一个登陆辅助验证系统。咱们国内是用手机短信做验证&#xff0c;当然 这个google身份验证只是一个辅助验证登陆方式。看一下演示 看到了嘛。 手机下载一个谷歌身份验证器就可以 。 谷歌身份验证器&#xff0c;我本身是一个基…

每天五分钟深度学习:神经网络和深度学习有什么样的关系?

本文重点 神经网络是一种模拟人脑神经元连接方式的计算模型&#xff0c;通过大量神经元之间的连接和权重调整&#xff0c;实现对输入数据的处理和分析。而深度学习则是神经网络的一种特殊形式&#xff0c;它通过构建深层次的神经网络结构&#xff0c;实现对复杂数据的深度学习…

python爬虫----了解爬虫(十一天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

算法打卡day23

今日任务&#xff1a; 1&#xff09;39. 组合总和 2&#xff09;40.组合总和II 3&#xff09;131.分割回文串 39. 组合总和 题目链接&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;…

NB-IOT——浅谈NB-IOT及模块测试

浅谈NB-IOT及模块基本使用测试 介绍什么是NB-IOT&#xff1f;NB-IOT的特点 使用准备基本使用 总结 介绍 什么是NB-IOT&#xff1f; NB-IoT&#xff0c;即窄带物联网&#xff08;Narrowband Internet of Things&#xff09;&#xff0c;是一种低功耗广域物联网&#xff08;LPW…

第十四届蓝桥杯(八题C++ 题目+代码+注解)

目录 题目一&#xff08;日期统计 纯暴力&#xff09;&#xff1a; 代码&#xff1a; 题目二&#xff08;01串的熵 模拟&#xff09;&#xff1a; 代码&#xff1a; 题目三&#xff08;治炼金属&#xff09;&#xff1a; 代码&#xff1a; 题目四&#xff08;飞机降落 深度…

springcloud基本使用二(远程调用)

创建两个springboot maven子项目 子项目名称分别为order-server和user-server 配置user-server子项目: 所需依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependenc…

【洛谷】P9240 [蓝桥杯 2023 省 B] 冶炼金属

题目链接 P9240 [蓝桥杯 2023 省 B] 冶炼金属 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 这道题可以用数学的方法去做&#xff0c;但是我想不到&#x1f607;有兴趣的可以去看看数学的题解 比较简单的思路就是二分查找&#xff0c;轻松简单不费脑&#xff0c;带你…

Linux中查看文件内容的命令

文章目录 一、七类常见的Linux的文件二、显示命令三、分页显示四、显示文件前后内容五、压缩、解压缩六、补充 一、七类常见的Linux的文件 字符文件类型-普通文件&#xff0c;包括纯文本文件、二进制文件、各种压缩文件等。在find命令中&#xff0c;type 选项中用 f来表示d目录…

共享社会经济路径(SSP1-5)中国及分省人口预估数据库_v2

v1数据集&#xff1a; 在共享社会经济路径&#xff08;SSPs&#xff09;全球框架下&#xff0c;根据本地化人口和经济参数&#xff0c;采用人口-发展-环境&#xff08;PDE&#xff09;模型&#xff0c;构建2020-2100年SSPs人口格点数据&#xff1b;采用柯布-道格拉斯&#xff…

AcWing刷题-游戏

游戏 DP l lambda: [int(x) for x in input().split()]n l()[0] w [0] while len(w) < n:w l()s [0] * (n 1) for i in range(1, n 1): s[i] s[i - 1] w[i]f [[0] * (n 1) for _ in range(n 1)]for i in range(1, n 1): f[i][i] w[i]for length in range(2, …

C,C++——指针详解

目录 1.指针的基本概念 代码示例&#xff1a; 2.指针所占内存空间 代码示例&#xff1a; 3.空指针和野指针 代码示例&#xff1a; 4.const修饰指针 代码示例&#xff1a; 5.指针和数组 代码示例&#xff1a; 6.指针和函数 代码示例&#xff1a; 7.指针&#x…