WPF中的绑定知识详解(含案例源码分享)

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:WPF 案例及知识分享专栏
✨特色专栏:乐趣国学-心性养成之路
🥭本文内容:WPF中的绑定知识详解(含案例源码分享)

文章目录

    • 1、单向绑定
    • 2、双向绑定
    • 3、单向到源绑定
    • 4、命令绑定

在这里插入图片描述
  当谈到WPF中的绑定,我们通常指的是数据绑定。数据绑定是一种机制,用于将数据源与用户界面元素(如控件)进行连接,以便在数据源发生更改时自动更新界面元素。这种机制使得开发人员能够轻松地实现MVVM(Model-View-ViewModel)模式,将数据和界面逻辑分离开来。

在WPF中,有几种不同类型的绑定可供选择,包括:

  • 单向绑定(OneWay Binding):数据源的更改会自动更新目标元素,但目标元素的更改不会反向更新数据源。
  • 双向绑定(TwoWay Binding):数据源的更改会自动更新目标元素,同时目标元素的更改也会反向更新数据源。
  • 单向到源绑定(OneWayToSource Binding):只有目标元素的更改会反向更新数据源,数据源的更改不会更新目标元素。
  • 命令绑定(Command Binding):将命令与界面元素进行绑定,以便在用户交互时执行特定的操作。

1、单向绑定

  单向绑定是一种数据绑定模式,它将数据源的值绑定到目标元素(如控件)的属性,使得当数据源的值发生变化时,目标元素的属性会自动更新。但是,目标元素的属性的更改不会反向更新数据源。

  在WPF中,可以使用单向绑定来实现将数据源的值显示在界面上,而不需要手动更新界面元素。这对于显示静态数据或只读数据非常有用。

  下面是一个示例,演示了如何在WPF中使用单向绑定:

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="OneWay Binding Example" Height="200" Width="300">
    <StackPanel>
        <TextBlock Text="{Binding Name}" />
        <TextBlock Text="{Binding Age}" />
    </StackPanel>
</Window>
public class Person : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            OnPropertyChanged(nameof(Name));
        }
    }

    private int _age;
    public int Age
    {
        get { return _age; }
        set
        {
            _age = value;
            OnPropertyChanged(nameof(Age));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

  在这个案例中,我们创建了一个Person类,它实现了INotifyPropertyChanged接口,该接口用于通知界面元素属性的更改。Person类包含一个Name属性和一个Age属性。

  在XAML中,我们使用了单向绑定将两个TextBlock的Text属性分别绑定到Person对象的Name属性和Age属性。当Person对象的属性值发生变化时,TextBlock的内容会自动更新。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        // 创建Person对象并设置属性值
        Person person = new Person();
        person.Name = "John";
        person.Age = 30;

        // 将Person对象设置为数据上下文
        DataContext = person;
    }
}

  在代码中,我们创建了一个MainWindow窗口,并将Person对象设置为窗口的数据上下文(DataContext)。这样,窗口中的绑定表达式就可以找到Person对象并绑定到它的属性。

  当运行这个示例时,窗口中的两个TextBlock将显示Person对象的Name属性和Age属性的值。如果我们在代码中更改Person对象的属性值,TextBlock的内容将自动更新。

  这就是单向绑定的详细阐述和一个简单的案例展示。通过单向绑定,我们可以轻松地将数据源的值显示在界面上,实现数据和界面的分离。

2、双向绑定

  双向绑定的概念: 双向绑定允许界面元素与数据模型之间的双向通信,确保它们保持同步。当你在界面元素上进行更改时,数据模型将相应地更新,反之亦然。这大大简化了开发过程,特别是在处理用户输入和表单数据时非常有用。

  在XAML中实现双向绑定: 在WPF中,你可以使用XAML来实现双向绑定。以下是一个简单的示例,说明如何将TextBox和ViewModel中的属性双向绑定:

<TextBox Text="{Binding Name, Mode=TwoWay}" />

  上述代码中,我们将TextBox的Text属性与ViewModel中的Name属性进行双向绑定。Mode=TwoWay 表示双向绑定,当TextBox的文本更改时,ViewModel的Name属性也会相应更新,反之亦然。

  在ViewModel中创建属性: 你需要在ViewModel中创建具有适当的属性通知机制的属性。通常,你可以使用INotifyPropertyChanged接口来实现这一点。以下是一个示例:

public class MyViewModel : INotifyPropertyChanged
{
    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));
    }
}

  双向绑定的案例展示: 让我们假设你有一个WPF窗口,其中包含一个TextBox和一个TextBlock。TextBox用于编辑用户名,TextBlock用于显示用户名。你可以实现双向绑定,以便在TextBox中输入内容时,TextBlock会立即更新,反之亦然。

  XAML部分:

<TextBox Text="{Binding Name, Mode=TwoWay}" />
<TextBlock Text="{Binding Name}" />

  ViewModel部分:

public class MyViewModel : INotifyPropertyChanged
{
    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));
    }
}

  在窗口的构造函数中,你需要将ViewModel与窗口的DataContext关联起来:

public MainWindow()
{
    InitializeComponent();
    DataContext = new MyViewModel();
}

  这样,TextBox和TextBlock将与ViewModel中的Name属性进行双向绑定。当你在TextBox中输入内容时,TextBlock会立即更新,反之亦然。

3、单向到源绑定

  单向到源绑定是通过WPF中的Binding类实现的。这种绑定类型通常在用户编辑UI元素(如文本框或滑块)中输入数据时使用,以将这些更改传递回数据源,如ViewModel或数据对象。当用户在UI元素中输入数据时,单向到源绑定将数据源更新为UI元素的值。

在XAML中,你可以使用以下方式创建一个单向到源绑定:

<TextBox Text="{Binding PropertyName, Mode=OneWayToSource}" />

  在这里,PropertyName 是你想要绑定的属性名称,而 Mode=OneWayToSource 表示这是一个单向到源绑定。

案例展示:

  假设你有一个简单的WPF应用程序,其中你需要将用户输入的数据绑定到一个ViewModel中的属性。以下是一个示例:

  首先,创建一个ViewModel类:

public class MyViewModel : INotifyPropertyChanged
{
    private string _textProperty;

    public string TextProperty
    {
        get { return _textProperty; }
        set
        {
            if (_textProperty != value)
            {
                _textProperty = value;
                OnPropertyChanged("TextProperty");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

  在XAML中,创建一个TextBox并将其绑定到ViewModel的TextProperty:

<TextBox Text="{Binding TextProperty, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" />

  这里,我们使用Mode=OneWayToSource来指定单向到源绑定,并使用UpdateSourceTrigger=PropertyChanged来在文本框内容更改时立即更新源。

  在代码中,将ViewModel设置为窗口的DataContext,并处理窗口加载事件:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        MyViewModel viewModel = new MyViewModel();
        this.DataContext = viewModel;
    }
}

  现在,当用户在TextBox中输入数据时,这些数据将自动更新到ViewModel的TextProperty属性中,因为我们使用了单向到源绑定。这样,你可以实现用户输入与数据源之间的双向通信。

4、命令绑定

  命令绑定是一种将用户界面元素的操作与后端逻辑代码进行连接的机制。通过命令绑定,您可以将按钮点击、菜单选择等用户操作与特定的命令关联起来,而不需要直接处理事件。

  命令绑定的优点之一是它可以将用户界面的逻辑与后端代码解耦,使代码更加清晰和可维护。此外,命令绑定还可以轻松地实现命令的重用,因为多个界面元素可以绑定到同一个命令上。

  下面是一个简单的案例展示,说明如何在WPF中使用命令绑定:

  首先,您需要在后端代码中创建一个实现了ICommand接口的命令类。例如,我们创建一个名为MyCommand的命令类:

public class MyCommand : ICommand
{
    public event EventHandler CanExecuteChanged;

    public bool CanExecute(object parameter)
    {
        // 在这里编写判断命令是否可执行的逻辑
        return true;
    }

    public void Execute(object parameter)
    {
        // 在这里编写命令执行的逻辑
        MessageBox.Show("命令已执行!");
    }
}

  然后,在XAML中,您可以将命令绑定到按钮的Command属性上:

<Button Content="点击我" Command="{Binding MyCommand}" />

  接下来,您需要在后端代码中创建一个命令实例,并将其绑定到界面的DataContext上:

public class ViewModel
{
    public ICommand MyCommand { get; set; }

    public ViewModel()
    {
        MyCommand = new MyCommand();
    }
}

  最后,在窗口的构造函数中,将ViewModel实例赋值给窗口的DataContext:

public MainWindow()
{
    InitializeComponent();
    DataContext = new ViewModel();
}

  现在,当用户点击按钮时,命令将被执行,弹出一个消息框。

  这只是一个简单的示例,您可以根据实际需求扩展和定制命令的逻辑。通过命令绑定,您可以更好地组织和管理WPF应用程序中的用户界面逻辑。


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flask后端开发(一)-基础知识和前期准备

目录 1.背景介绍1.1. 项目背景1.2. 项目难点1.3. 项目环境 2. flask后端开发实现的功能3. flask部署和前后端对接3.1. flask运行配置和服务器部署3.2. flask前后端传参 4. 后端测试工具4.1. 工具介绍4.2. 工具使用 后记 1.背景介绍 1.1. 项目背景 就是前几个月临时接手了一个…

13.4web自动化测试(Selenium3+Java)

一.定义 用来做web自动化测试的框架. 二.特点 1.支持各种浏览器. 2.支持各种平台(操作系统). 3.支持各种编程语言. 4.有丰富的api. 三.工作原理 四.搭环境 1.对照Chrome浏览器版本号,下载ChromeDriver,配置环境变量,我直接把.exe文件放在了jdk安装路径的bin文件夹下了(j…

LSM Tree 深度解析

我们将深入探讨日志结构合并树&#xff0c;也称为LSM Tree&#xff1a;这是许多高度可扩展的NoSQL分布式键值型数据库的基础数据结构&#xff0c;例如Amazon的DynamoDB、Cassandra和ScyllaDB。这些数据库的设计被认为支持比传统关系数据库更高的写入速率。我们将看到LSM Tree如…

分享10个创意满满的产品设计网站

在当今的互联网时代&#xff0c;新颖性和创造力是最受关注的&#xff0c;无论一个产品有多好&#xff0c;但没有创意的包装都很难“看到太阳”。因此&#xff0c;创意产品的设计非常重要&#xff0c;今天小将为您带来10个非常有创意的产品设计网站。话不多说&#xff0c;上干货…

越流行的大语言模型越不安全

源自&#xff1a;GoUpSec “人工智能技术与咨询” 发布 安全研究人员用OpenSSF记分卡对GitHub上50个最流行的生成式AI大语言模型项目的安全性进行了评估&#xff0c;结果发现越流行的大语言模型越危险。 近日&#xff0c;安全研究人员用OpenSSF记分卡对GitHub上50个最流…

Sentinel授权规则和规则持久化

大家好我是苏麟 , 今天说说Sentinel规则持久化. 授权规则 授权规则可以对请求方来源做判断和控制。 授权规则 基本规则 授权规则可以对调用方的来源做控制&#xff0c;有白名单和黑名单两种方式。 白名单&#xff1a;来源&#xff08;origin&#xff09;在白名单内的调用…

批量编辑 Outlook 联系人

现状 Outlook 自带的联系人编辑功能无法快速、批量编辑联系人字段使用 Excel 等外部编辑器&#xff0c;可批量编辑联系人 导出联系人到文件 在【联系人】界面&#xff0c;点击【文件】在【文件】界面&#xff0c;点击【打开和导出】–>【导入/导出】在弹出的向导窗口中点…

FPGA从入门到精通(二十)SignalTapII

这一篇将介绍SignalTapII。 之前的工程我们是做仿真&#xff0c;设置激励&#xff0c;观察输出波形去判断代码没有问题&#xff0c;但事实上我们真实的需求是综合后的代码下载到FPGA芯片中能够符合预期。 其中可能出现问题的原因有&#xff1a; 1、我们是写testbench设置激励…

接口自动化测试 —— Jmeter 6种定时器应用

①定时器是在每个sampler&#xff08;采样器&#xff09;之前执行的&#xff0c;而不是之后&#xff0c;不管这个定时器的位置放在sampler之后&#xff0c;还是之下&#xff0c;都在sampler之前得到执行 ②定时器是有作用域的&#xff0c;当执行一个sampler之前时&#xff0c;…

华为云2023年双十一服务器优惠价格表及活动大全

2023华为云双11优惠活动「云上优选 特惠来袭」&#xff0c;阿腾云atengyun.com整理云服务器优惠价格表&#xff0c;华为云L实例-2核2G3M一年优惠价89元、L实例-2核2G4M价格108元一年、L实例-2核4G5M优惠价198元一年&#xff0c;三年1000元、HECS云服务器-1核2G1M带宽39元一年、…

JavaScript 生成 16: 9 宽高比

这篇文章只是对 for 循环一个简单应用&#xff0c;没有什么知识含量。 可以跳过这篇文章。 只是我用来保存一下我的代码&#xff0c;保存在本地我嫌碍眼&#xff0c;总想把他删了。 正文部分 公式&#xff1a;其中 width 表示宽度&#xff0c;height 表示高度 16 9 w i d t…

大集合按照指定长度进行分割成多个小集合,用于批量多次处理数据

&#x1f4da;目录 拆分案例拆分的核心代码 通常我们对集合的更新或者保存都需要用集合来承载通过插入的效率&#xff0c;但是这个会遇到一个问题就是你不知道那天那个集合的数量可能就超了&#xff0c;虽然我们连接数据库进行批量提交会在配置上配置allowMultiQueriestrue,但是…

【c语言】结构体内存对齐,位段,枚举,联合

之前学完结构体&#xff0c;有没有对结构体的大小会很疑惑呢&#xff1f;&#xff1f;其实结构体在内存中存储时会存在内存对齐&#xff0c;捎带讲讲位段&#xff0c;枚举&#xff0c;和联合&#xff0c;跟着小张一起学习吧 结构体内存对齐 结构体的对齐规则: 第一个成员在与结…

Android 12 源码分析 —— 应用层 四(SystemUI的基本布局设计及其基本概念)

Android 12 源码分析 —— 应用层 四&#xff08;SystemUI的基本布局设计及其基本概念&#xff09; 在上两篇文章中&#xff0c;我们介绍SystemUI的启动过程&#xff0c;以及基本的组件依赖关系。基本的依赖关系请读者一定要掌握&#xff0c;因为后面的文章&#xff0c;将会时…

【力扣】416. 分割等和子集 <动态规划、回溯>

【力扣】416. 分割等和子集 给你一个 只包含正整数的非空数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5,…

【Nacos】使用Nacos进行服务发现、配置管理

Nacos Nacos是 Dynamic Naming and Configuration Service 的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 版本说明&#xff1a;版本说明 alibaba/spring-cloud-alibaba Wiki GitHub <properties><java.version>…

vue报错RangeError: Maximum call stack size exceeded

这种情况&#xff0c;一般是跳转路由时发生此类错误&#xff0c;像我的就是如此。比如路由指向的vue文件里代码有错误&#xff0c;或者设置路由时重定向了路由自己&#xff0c;造成死循环。 1、首先检查自己跳转的路由地址的代码本身是否有语法错误之类的&#xff0c;造成错误…

Python中的os模块:walk函数与listdir函数的深度解析

Python中的os模块&#xff1a;walk函数与listdir函数的深度解析 os.walk()函数listdir()函数使用场景案例一&#xff1a;遍历目录树并处理文件案例二&#xff1a;列出目录中的文件名并执行某些操作 总结 在Python中&#xff0c;os模块提供了许多与操作系统交互的功能&#xff0…

opencv案例06-基于opencv图像匹配的消防通道障碍物检测与深度yolo检测的对比

基于图像匹配的消防通道障碍物检测 技术背景 消防通道是指在各种险情发生时&#xff0c;用于消防人员实施营救和被困人员疏散的通道。消防法规定任何单位和个人不得占用、堵塞、封闭消防通道。事实上&#xff0c;由于消防通道通常缺乏管理&#xff0c;导致各种垃圾&#xff0…

(十九)大数据实战——Flume数据采集框架安装部署

前言 本节内容我们主要介绍一下大数据数据采集框架flume的安装部署&#xff0c;Flume 是一款流行的开源分布式系统&#xff0c;用于高效地采集、汇总和传输大规模数据。它主要用于处理大量产生的日志数据和事件流。Flume 支持从各种数据源&#xff08;如日志文件、消息队列、数…