C# WPF编程-元素绑定

news2025/1/11 21:41:47

C# WPF编程-元素绑定

  • 将元素绑定到一起
    • 绑定表达式
    • 绑定错误
    • 绑定模式
    • 代码创建绑定
    • 移除绑定
    • 使用代码检索绑定
    • 多绑定
    • 绑定更新
    • 绑定延时
  • 绑定到非元素对象
    • Source属性
    • RelativeSource属性
    • DataContent属性

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

将元素绑定到一起

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

常用的绑定属性字段:

  • ElementName:绑定元素名称
  • Path:绑定值
  • Mode:绑定模式
  • UpdateSourceTrigger:绑定更新方式
  • Delay:延时时间
<TextBlock x:Name="textFontSize"
           Text="{Binding ElementName=textInput, Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,Delay=500}"></TextBlock>

简单示例,通过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>

绑定到非元素对象

在数据驱动的应用程序中,更常见的情况是创建从不可见对象中提取数据的绑定表达式。唯一要求是希望显示的信息必须存储在公有属性中。WPF数据绑定基础结构不能获取私有信息或公有字段。
当绑定到非元素对象时,需要放弃Binding.ElementName属性,并使用以下属性中的一个:

  • Source:该属性是指向源对象的引用,也就是提供数据的对象。
  • RelativeSource:这是引用,使用RelateveSource对象指向源对象。有了这个附加层,可在当前元素的基础上构建引用。
  • DataContext:如果没有使用Source或RelativeSource属性指定源,WPF就从当前元素开始在元素树中向上查找。检查每个元素的DataContext属性,并使用第一个非空的DataContext属性。

Source属性

Source属性非常简单。唯一的问题是为了进行绑定,需要具有数据对象。有多种方法获取数据对象。可从资源中提取数据对象,可通过编写代码生成数据对象,也可在数据提供程序的帮助下获取数据对象。

  1. 最简单的选择是将Source属性指向一些已经准备好了的静态对象。如,使用来自.NET类库的组件:
<TextBlock Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=Source}"></TextBlock>

这个绑定表达式获取由静态属性SystemFonts.IconFontFamily提供的FontFamily对象。注意需要借助静态标记扩展Static。

  1. 绑定到先前作为资源创建的对象。如,标记创建指向Calibri字体的FontFamily对象:
<Window.Resources>
	<FontFamily x:Key="CustomFont">Calibri</FontFamily>
</Window.Resources>

TextBlock元素会被绑定到该资源:

<TextBlock Text="{Binding Source={StaticResource CustomFont}, Path=Source}"></TextBlock>

RelativeSource属性

通过RelativeSource属性可根据相对目标对象的关系指向源对象。例如,可使用RelativeSource属性将元素绑定到自身或其父元素。RelativeSource对象使用FindAncestor模式,该模式告知查找到元素树直到发现AncestorType属性定义的元素类型。

<TextBlock>
    <TextBlock.Text>
        <Binding Path="Title">
            <Binding.RelativeSource>
                <RelativeSource Mode="FindAncestor" AncestorType="{x:Type Window}"/>
            </Binding.RelativeSource>
        </Binding>
    </TextBlock.Text>
</TextBlock>

在这里插入图片描述

编写绑定更常用的方法是使用Binding和RelativeSource标记扩展,将其合并到一个字符串种,如下所示:

        <TextBlock Text="{Binding Path=Title, 
            RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}">
        </TextBlock>    

RelativeSourceMode 枚举值

名称说明
self表达是绑定到同一元素的另一个属性上
FindAncestor表达式绑定到父元素。
PreviousData表达式绑定到数据绑定列表的前一个数据项。在列表元素中会使用到这种模式
TemplateParent表达式绑定到应用模板的元素。只有当绑定位于控件模板或数据模板内部时,这种模式才能工作。

DataContent属性

在某些情况下,会将大量元素绑定到同一个对象。

可使用和设置Binding.Source属性相同的方法设置元素的DataContext属性。

    <StackPanel DataContext="{x:Static SystemFonts.IconFontFamily}">
        <TextBlock Text="{Binding Path=Source}"></TextBlock>
    </StackPanel>

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

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

相关文章

深度学习pytorch实战第P2周:CIFAR10彩色图片识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 零、引言&#xff08;温故而知新&#xff…

什么是ICMP协议,如何防护ICMP攻击

一.什么是ICMP ICMP&#xff08;Internet Control Message Protocol&#xff09;是互联网控制报文协议&#xff0c;是TCP/IP协议族的一个子协议。它主要用于在IP网络中传递控制信息和错误消息&#xff0c;是IP协议的补充。ICMP协议是一种无连接协议&#xff0c;它不需要建立…

SambaNova 芯片:深入解析其架构和高性能秘诀

SambaNova——一家总部位于帕洛阿尔托的公司已经筹集了超过10亿美元的风险投资&#xff0c;不会直接向公司出售芯片。相反&#xff0c;它出售其定制技术堆栈的访问权限&#xff0c;该堆栈具有专门为运行最大的人工智能模型而设计的专有硬件和软件。 最近&#xff0c;SambaNova…

MySQL - 基础三

11、事务管理 CURD不加控制&#xff0c;会有什么问题&#xff1f; 当客户端A检查还有一张票时&#xff0c;将票卖掉&#xff0c;还没有执行更新数据库时&#xff0c;客户端B检查了票数&#xff0c;发现大于0&#xff0c;于是又卖了一次票。然后A将票数更新回数据库。这是就出现…

面经分享(Flask,轻量级Web框架)

1. Flask的核心特点 a. 轻量级&#xff1a;核心简洁&#xff0c;只提供了基本的功能&#xff0c;其他高级功能可以通过插件或扩展来添加。 b. 灵活性&#xff1a;允许开发者选择适合自己项目的组件和工具&#xff0c;没有强制的项目结构和设计模式。 c. 易于扩展&#xff1a;提…

OPPO VPC 实践探索

01 概述 一年前(20年6月)&#xff0c;OPPO云网络技术底座开始支持VPC方案&#xff0c;解决了用户担心的云上安全和虚拟实例的性能问题。我们称这个版本为VPC1.0&#xff0c;其采用了先进的智能网卡加速和VXLAN隧道隔离技术&#xff0c;实现了VPC从无到有的突破。 然而由于业务快…

FreeRtos入门-3 信号量(计数值、二进制、互斥量、递归锁)

信号量 计数量 二进制 互斥量 递归锁 创建 xSemCalc xSemaphoreCreateCounting(10, 0);//计数最大值10&#xff0c;初始值0 xSemUart xSemaphoreCreateBinary(); xSemUART xSemaphoreCreateMutex(); xSemUART xSemaphoreCreateRecursiveMutex(); 释放 xSemaphore…

mysql 判断一张表是否存在的方法

查询表是否存在 使用 SHOW TABLES SHOW TABLES LIKE %tbl_tabl%;结果: 查询 INFORMATION_SCHEMA // like 匹配 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA test AND TABLE_NAME like %tbl%; // 完全匹配 SELECT TABLE_NAME FROM INFORMATION_SC…

JVM基础二——类的生命周期

加载阶段 &#xff1a; 连接阶段&#xff1a; 初始化阶段&#xff1a; 总结&#xff1a;

C++ | Leetcode C++题解之第10题正则表达式匹配

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isMatch(string s, string p) {int m s.size();int n p.size();auto matches [&](int i, int j) {if (i 0) {return false;}if (p[j - 1] .) {return true;}return s[i - 1] p[j - 1];};vector<…

计算机网络——数据链路层(流量传输与可靠传输机制)

计算机网络——数据链路层&#xff08;流量传输与可靠传输机制&#xff09; 流量传输与可靠传输机制流量控制可靠传输机制 停止-等待协议无差错情况接收并检测到差错状态确认丢失或迟到状态 停等协议的效率分析后退N帧协议&#xff08;Go-Back-N&#xff0c;简称GBN&#xff09…

KnowLog:基于知识增强的日志预训练语言模型|顶会ICSE 2024论文

徐波 东华大学副教授 东华大学计算机学院信息技术系副系主任&#xff0c;复旦大学知识工场实验室副主任&#xff0c;智能运维方向负责人。入选“上海市青年科技英才扬帆计划”。研究成果发表在IJCAI、ICDE、ICSE、ISSRE、ICWS、CIKM、COLING等国际会议上&#xff0c;曾获中国数…

Linux 内核优化简笔 - 高并发的系统

简介 Linux 服务器在高并发场景下&#xff0c;默认的内核参数无法利用现有硬件&#xff0c;造成软件崩溃、卡顿、性能瓶颈。 当然&#xff0c;修改参数只是让Linux更好软件的去利用已有的硬件资源&#xff0c;如果硬件资源不够也无法解决问题的。而且当硬件资源不足的时候&am…

小红的平滑值插值【牛客周赛38】

题目描述&#xff1a; 小红定义一个数组的“平滑值”为&#xff1a;相邻两数差的绝对值的最大值。 具体的&#xff0c;数组a的平滑值定义为 现在小红拿到了一个数组。她每次操作可以在两个元素之间添加一个整数&#xff08;不能添加在第一项前面或者最后一项后面&#xff09;。…

鸿蒙开发第一课-工具与HelloWorld

武汉数字人才实训基地 一、初始HarmonyOS以及DevEco Studio 2023年8月4日&#xff0c;HarmonyOS 4.0操作系统正式发布。华为鸿蒙Next&#xff08;HarmonyOS Next&#xff09;操作系统开发者预览版(Developer Preview)发布。超过7亿台设备搭载了HarmonyOS 系统 2024年&#xf…

时序预测 | Matlab基于CFBP级联前向BP神经网络时序预测

时序预测 | Matlab基于CFBP级联前向BP神经网络时序预测 目录 时序预测 | Matlab基于CFBP级联前向BP神经网络时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab基于CFBP级联前向BP神经网络时序预测&#xff08;完整源码和数据)&#xff1b; 2.数据集为excel…

提灯定损的建模-UMLChina建模知识竞赛第5赛季第9轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。 如果有第4题&#xff0c;第4题为附加题&am…

阿里 对象存储OSS 云存储服务

1.简介 对象存储服务(Object Storage Service ,OSS) 是一种 海量、安全、低成本、高可靠的云存储服务&#xff0c;适合存放任意类型的文件。容量和处理能力弹性扩展&#xff0c;多种存储类型供选择&#xff0c;全面优化存储成本。 2.如何使用。参考文档 看文档&#xff0c;说的…

LeNet卷积神经网络

文章目录 简介conv2d网络层的结构 简介 它是最早发布的卷积神经网络之一 conv2d 这个卷积成的参数先进行介绍一下&#xff1a; self.conv1 nn.Conv2d(in_channels3, out_channels10, kernel_size3, stride1, padding1)先看一下in_channels 输入的通道数&#xff0c;out_cha…

Kotlin学习日志(一)TextView、Button、Toast的使用(1)

android:layout_width“wrap_content” android:layout_height“wrap_content”/> import kotlinx.android.synthetic.main.activity_main.* 这句话的意思是引进Kotlin的的控件变量自动映射功能&#xff0c;接下来只要是这个activity_main.xml文件中的控件&#xff0c;我…