WPF中的Binding的常见知识点与技巧

news2024/11/27 14:29:41

完全来源于十月的寒流,感谢大佬讲解
在这里插入图片描述

在XAML中,可以绑定到许多不同类型的数据源和属性。以下是一些可以绑定的常见数据源和属性:

  1. 属性:可以绑定到对象的属性,例如控件的TextVisibilityIsEnabled等属性。

  2. 集合:可以绑定到集合数据,如ListObservableCollectionArray等。在绑定到集合时,还可以使用索引器绑定到特定项。

  3. 静态资源:可以使用x:Static引用静态字段或属性,如常量、枚举、静态类的属性等。

  4. 数据上下文:在WPF和其他XAML框架中,每个元素都有一个数据上下文,可以在此上下文中绑定到其父元素的属性或继承的数据上下文的属性。

  5. 数据模型:可以绑定到MVVM(Model-View-ViewModel)模式中的数据模型,通常是一个实现INotifyPropertyChanged接口的类。

  6. XML和JSON数据:可以绑定到XML或JSON数据,使用XMLDataProvider或ObjectDataProvider等。

  7. 资源字典:可以绑定到资源字典中的资源,如样式、模板、图像等。

  8. 命令:可以使用Command绑定到自定义命令,以在用户交互时执行操作。

  9. 视觉状态:可以绑定到不同的视觉状态,以根据应用程序的当前状态更改UI。

  10. 动画:可以绑定到动画属性,以在动画执行时更改UI元素的属性。

这些只是一些常见的绑定数据源,实际上,XAML绑定是非常灵活的,可以将其用于几乎任何具有属性或数据的地方。数据绑定是XAML中非常强大的特性,可以用于创建动态、交互式和可扩展的用户界面。

一、Source

<Window x:Class="BindingTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BindingTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Window.DataContext>
        <local:MainWindowViewModel></local:MainWindowViewModel>
    </Window.DataContext>

    <Window.Resources>
    </Window.Resources>

    <StackPanel>
        <TextBlock Text="{Binding}" FontSize="30"></TextBlock>
    </StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace BindingTest
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }

    public class MainWindowViewModel
    {
        public string Message => "this is test";

        public override string ToString()
        {
            return "hello world"; 
        }
    }
}

后台实现binding

<Window x:Class="BindingTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BindingTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">

    <Window.DataContext>
        <local:MainWindowViewModel></local:MainWindowViewModel>
    </Window.DataContext>

    <Window.Resources>
    </Window.Resources>

    <StackPanel>
        <TextBlock x:Name="tbl" FontSize="30"></TextBlock>
    </StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace BindingTest
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            var binding = new Binding
            {
                Path = new PropertyPath("Message"),
                Mode = BindingMode.TwoWay,
            };
            BindingOperations.SetBinding(tbl, TextBlock.TextProperty, binding);
        }
    }

    public class MainWindowViewModel
    {
        private string message = "this is test";
        public string Message
        {
            get { return message; }
            set { message = value; }
        }
    }
}

绑定StaticResource资源

<Window x:Class="BindingTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BindingTest" 
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">

    <Window.DataContext>
        <local:MainWindowViewModel></local:MainWindowViewModel>
    </Window.DataContext>

    <Window.Resources>
        <sys:String x:Key="str">Hello, World</sys:String>
    </Window.Resources>

    <StackPanel>
        <TextBlock x:Name="tbl" FontSize="30" Text="{Binding Source={StaticResource str}}"></TextBlock>
    </StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace BindingTest
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
        }
    }

    public class MainWindowViewModel
    {
        private string message = "this is test";
        public string Message
        {
            get { return message; }
            set { message = value; }
        }
    }
}

使用StaticResource和DynamicResource资源

<Window x:Class="BindingTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BindingTest" 
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">

    <Window.DataContext>
        <local:MainWindowViewModel></local:MainWindowViewModel>
    </Window.DataContext>

    <Window.Resources>
        <sys:String x:Key="str">Hello, World</sys:String>
    </Window.Resources>

    <StackPanel>
        <!--<TextBlock x:Name="tbl_1" FontSize="30" Text="{Binding Source={DynamicResource str}}"></TextBlock>-->
        <TextBlock x:Name="tbl_2" FontSize="30" Text="{Binding Source={StaticResource str}}"></TextBlock>
        <TextBlock x:Name="tbl_3" FontSize="30" Text="{DynamicResource str}"></TextBlock>        
    </StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace BindingTest
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.Resources["str"] = "GoodBye";
        }
    }
    
    public class MainWindowViewModel
    {
        private string message = "this is test";
        public string Message
        {
            get { return message; }
            set { message = value; }
        }
    }
}

<TextBlock x:Name="tbl_1" FontSize="30" Text="{Binding Source={DynamicResource str}}"></TextBlock>
       这是尝试在TextBlock元素的Source属性上使用DynamicResource,但是Source属性不是DependencyProperty,因此无法直接使用DynamicResource。只能在DependencyObject的DependencyProperty上使用DynamicResource。
       要在TextBlock中使用DynamicResource,应该将DynamicResource绑定到Text属性,而不是Source属性。例如,可以这样修改XAML:
<TextBlock x:Name="tbl_1" FontSize="30" Text="{DynamicResource str}"></TextBlock>
       这将允许使用DynamicResource来绑定Text属性,而不会引发异常。DynamicResource通常用于将资源动态应用到具有DependencyProperty的元素,而不是Source属性。

使用属性、静态属性、常量资源

<Window x:Class="BindingTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BindingTest" 
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">

    <Window.DataContext>
        <local:MainWindowViewModel></local:MainWindowViewModel>
    </Window.DataContext>

    <Window.Resources>
        <sys:String x:Key="str">Hello, World</sys:String>
        <local:MyResource x:Key="myres"></local:MyResource>
    </Window.Resources>

    <StackPanel>
        <!--<TextBlock x:Name="tbl_1" FontSize="30" Text="{Binding Source={DynamicResource str}}"></TextBlock>-->
        <!--<TextBlock x:Name="tbl_2" FontSize="30" Text="{Binding Source={StaticResource str}}"></TextBlock>-->
        <!--<TextBlock x:Name="tbl_3" FontSize="30" Text="{DynamicResource str}"></TextBlock>-->

        <TextBlock FontSize="30" Text="{Binding Source={StaticResource myres}, Path=Message}"></TextBlock>
        <TextBlock FontSize="30" Text="{Binding Source={x:Static local:MyResource.StaticString}}"></TextBlock>
        <TextBlock FontSize="30" Text="{Binding Source={x:Static local:MyResource.ConstString}}"></TextBlock>
    </StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace BindingTest
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.Resources["str"] = "GoodBye";
        }
    }

    public class MyResource
    {
        public string Message { get; } = "Public Property";
        public static string StaticString { get; } = "Static String";
        public const string ConstString = "Const String";
    }

    public class MainWindowViewModel
    {
        private string message = "this is test";
        public string Message
        {
            get { return message; }
            set { message = value; }
        }
    }
}

待学习
<CollectionViewSource></CollectionViewSource>
<ObjectDataProvider></ObjectDataProvider>

二、ElementName

<Window x:Class="BindingTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BindingTest" 
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">

    <Window.DataContext>
        <local:MainWindowViewModel></local:MainWindowViewModel>
    </Window.DataContext>

    <Window.Resources>
    </Window.Resources>

    <StackPanel>
        <TextBox FontSize="30" x:Name="txt"></TextBox>
        <TextBox FontSize="30" Text="{Binding ElementName=txt, Path=Text, Mode=TwoWay}"></TextBox>
    </StackPanel>
</Window>

**在上述XAML代码中,第二个试图通过绑定将其文本与第一个TextBox的文本同步,而且将绑定模式设置为TwoWay。理论上,这意味着当更改第二个TextBox中的文本时,第一个TextBox的文本也应该相应地更改。

然而,在这里遇到的问题可能是由于两个TextBox之间的绑定路径的问题。具体来说,第二个TextBox的绑定路径ElementName=txt, Path=Text指示它应该与txt元素的Text属性进行双向绑定。这意味着它将复制txt元素的Text属性的值,但并不会与txtText属性绑定在一起,所以当更改第二个TextBox的文本时,第一个TextBox的文本不会随之更改。

如果想要实现两个TextBox之间的文本同步,可以尝试以下修改:

<StackPanel>
    <TextBox FontSize="30" x:Name="txt"></TextBox>
    <TextBox FontSize="30" Text="{Binding ElementName=txt, Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>
</StackPanel>

通过添加UpdateSourceTrigger=PropertyChanged,可以确保当第二个TextBox的文本更改时,立即将值传播回数据源(即第一个TextBoxText属性),从而实现双向绑定。这样,当更改第二个TextBox的文本时,第一个TextBox的文本也会跟着变化。

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

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

相关文章

爱上C语言:函数递归,青蛙跳台阶图文详解

&#x1f680; 作者&#xff1a;阿辉不一般 &#x1f680; 你说呢&#xff1a;生活本来沉闷&#xff0c;但跑起来就有风 &#x1f680; 专栏&#xff1a;爱上C语言 &#x1f680;作图工具&#xff1a;draw.io(免费开源的作图网站) 如果觉得文章对你有帮助的话&#xff0c;还请…

Python基础入门例程42-NP42 公式计算器(运算符)

最近的博文&#xff1a; Python基础入门例程41-NP41 二进制位运算&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程40-NP40 俱乐部的成员&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程39-NP39 字符串之间的比较&#xff08;运算符&#xff09;-C…

Zeus IoT : 基于 SpringBoot 的分布式开源物联网大数据平台

Zeus IoT 是一个集设备数据采集、存储、分析、观测为一体的开源物联网平台&#xff0c;全球首创基于 Zabbix 的物联网分布式数据采集架构&#xff0c;具备超百万级物联网设备的并发监控能力&#xff0c;真正具备工业级性能与稳定性的开源物联网大数据中台。 Zeus IoT 致力于让设…

apachesolr中简单使用

core使用 首先点击add core 可以看到报错solrconfig.xml不在new_core目录下&#xff0c;new_core是我们点击后自动创建的 那么我们将D:\solr2\solr-9.3.0\solr-9.3.0\server\solr\configsets下的任何一个目录下的conf拷贝到new_core过去 这里是使用_default下的conf目录拷贝…

Android Studio 常见问题

一、Android Studio 创建项目后Gradle(构建)项目很慢问题解决 在使用Android Studio创建项目时&#xff0c;会自动从网上下载相关依赖。由于是访问国外服务器&#xff0c;会出现构建项目时下载依赖很慢的问题。为了解决该问题&#xff0c;需要在settings.gradle(或者settings.…

Netty第二部

一、EventLoop和EventLoopGroup 一个Channel可以近似的理解成一个Socket的包装&#xff0c;EventLoop管理这些Channel的 1、EventLoop EventLoop作为线程&#xff0c;具体Channel由EventLoop管理&#xff0c;在AbstractChannel类的register()方法可以体现 Override public …

MySQL索引优化与查询优化

1. 索引失效案例 MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了访问高效数据的方法&#xff0c;并且加快查询的速度&#xff0c;因此索引对查询的速度有着至关重要的影响。 使用索引可以快速地定位表中的某条记录&#xff0c;从而提高数据库查询的速…

C语言查看各数据类型所占大小

编译器&#xff1a;VC2010 #include<stdio.h> int main() {printf("%d\n",sizeof(char));printf("%d\n",sizeof(short));printf("%d\n",sizeof(int));printf("%d\n",sizeof(long));printf("%d\n",sizeof(long long))…

ActiveMq学习⑥__实战篇(Spring 、SpringBoot)

spring 管理ActiveMQ Maven修改&#xff0c;需要添加Spring 支持Jms的pom 包Spring配置文件队列主题在Spring里面实现消费不启动&#xff0c;直接通过配置监听完成 依赖引入 <!--spring整合mq--><!--activemq对JMS的支持&#xff0c;整合SPringle和Activemq-->&l…

圣杯布局/双飞翼布局/flex/grid等,实现CSS三栏自适应布局的几种方法

简介 三栏布局是网页设计中常用的布局&#xff0c;即网页中的内容被分为三块&#xff1a;左侧/中间/右侧。其中两侧部分宽度固定&#xff0c;中间部分宽度自适应的根据浏览器宽度撑满剩余空间。而三栏布局也有很多变形&#xff0c;比如两栏或者N栏布局&#xff0c;上中下三栏布…

【漏洞复现】S2-045 Remote Code Execution(CVE-2017-5638)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描nacs3、漏洞验证 1.5、修复建议 说明内容漏洞编号CVE-2017-5638漏洞名称S2-045 远程代码执行漏…

51单片机-中断

文章目录 前言 前言 #include <reg52.h> #include <intrins.h>sbit key_s2P3^0; sbit flagP3^7;void delay(unsigned int z){unsigned int x,y;for(xz;x>0;x--)for(y114;y>0;y--); }void int_init(){EA1;EX11;IT11;}void main(){int_init();while(1){if (key…

【产品资料】产品经理面试问题(三)

今天和大家免费分享产品经理常见的面试题目&#xff0c;含回答思路分析和回答事例。 【资源下载】 这个资源可以在Axure高保真原型哦小程序里免费下载 打开下方小程序后&#xff0c;搜索产品经理面试题目&#xff0c;获取下载地址 更多原型模板、视频教程、产品文档、定制服…

c++11中的线程库和包装器

c11 1. 线程库1.1 线程库1.2 锁mutex 2. 包装器2.1 funciton2.2 bind 1. 线程库 1.1 线程库 C11中的线程库提供了一种方便的方式来创建和管理线程。其中&#xff0c;std::thread是一个重要的类&#xff0c;它允许我们创建新线程并控制它们的执行。以下是std::thread的一些重要…

磁盘物理结构介绍(磁头,扇区),chs寻址,如何读写,磁盘io消耗时间;线性抽象结构,lba寻址,分区引入

目录 磁盘文件 引入 看待角度 磁盘 介绍 物理结构 俯视图 立体图 磁头 扇区 如何找到一个扇区 -- CHS寻址 如何读写 磁盘io消耗时间 抽象结构 -- 线性 引入 介绍 -- LBA寻址 分区 引入 介绍 磁盘文件 引入 文件分为两种 被打开的文件(主要讨论与进程之间的…

python基础速通

1. 梳理&#xff1a;目前学习了哪几种数据类型&#xff0c; 每一个数据类型定义一个变量&#xff0c;并输出内容以及类型 # 数据类型 # 整型 int_data 1 print(int_data, type(int_data)) # 浮点型 float_data 1.2 print((float_data, type(float_data))) # 复数 complex_da…

计算机毕设 基于大数据的社交平台数据爬虫舆情分析可视化系统

文章目录 0 前言1 课题背景2 实现效果**实现功能****可视化统计****web模块界面展示**3 LDA模型 4 情感分析方法**预处理**特征提取特征选择分类器选择实验 5 部分核心代码6 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕…

Monarch Mixer:一种性能比Transformer更强的网络架构

六年前&#xff0c;谷歌团队在arXiv上发表了革命性的论文《Attention is all you need》。作为一种优势的机器学习网络架构&#xff0c;Transformer技术迅速席卷全球。Transformer一直是现代基础模型背后的主力架构&#xff0c;并且在不同的应用程序中取得了令人印象深刻的成功…

[云原生1. ] Docker consul的详细介绍(容器服务的更新与发现)

文章目录 1. 服务注册与发现的概述1.1 cmp问题1.2 解决方法 2. Consul的概述2.1 简介2.2 为什么要使用Consul服务模块2.2 Consul的服务架构2.3 Consul的一些关键特性 3. consul服务部署3.1 前置准备3.2 Consul服务器3.2.1 建立 Consul 服务3.2.2 设置代理&#xff0c;在后台启动…

Linux开发工具的使用(vim、gcc/g++)

文章目录 vimvim基本概念vim的常用三种模式vim三种模式的相互转换vim命令模式下的命令集移动光标删除文字剪切/删除复制替换撤销和恢复跳转至指定行 vim底行模式下的命令集 gcc/ggcc/g的作用gcc/g的语法预处理编译汇编链接函数库动静态库动态链接的优缺点 静态链接的优缺点 vim…