绑定与通知属性到界面

本文同时为b站WPF课程的笔记,相关示例代码

前言

在上一篇文章C#代码事件里面,我们介绍了利用给控件命名的方式,在后端代码中访问并修改属性。这样子直截了当,但是这样后端代码依赖于前端。如果前端的代码变动较大,后端代码可能要大面积重构。

于是利用绑定的这种方法,将前后端分离,前端只需把需要修改的属性设置好绑定变量名,后端只需盯着这些变量名进行操作。

这样还可以实现前后端双人开发,后端开发者只需把那些操作的接口名称告诉前端,让对方去绑定相应的空间属性即可。

绑定

控件属性设置为"{Binding xxxx}"

例如绑定文本框的文字内容到UserName

<TextBox Text="{Binding UserName}" Grid.Row="0" Grid.Column="1" Margin="2"/>

在后端中写入:

public string UserName { get; set; }

接下来就可以在后端的代码中直接使用变量UserName

其中get; set;是自动生成了属性的访问器,分别用于获取属性的值与修改属性的值。这是自动实现的属性,不需要手写。

可以输入prop然后按 Tab 键两次,一键生成

public int MyProperty { get; set; }

属性的代码模板,加快了编写常见代码结构的速度。

属性的初值

假如想要程序刚运行的时候,文本框里就已经有文字,可以给绑定的变量赋值:

public string UserName { get; set; } = "333"

但是运行会发现,并没有预期的效果。

可以在窗口的构造函数public MainWindow()中,初始化窗口InitializeComponent();之后,将窗口的 DataContext 设置为窗口本身的实例:

public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}

在上面的例子中,UserNameMainWindow 的一个属性。通过将 DataContext 设置为 this(即 MainWindow 的当前实例),告诉了数据绑定引擎应该在当前的 MainWindow 实例中查找 UserName 属性。

这样,在 XAML 中使用 {Binding UserName} 的时候,它能正确地找到 MainWindowUserName 属性,并将其与 UI 元素关联起来。

自动更新界面

接下来的后端代码中,即使对于变量UserName做出了修改,前台的界面也不会实时的发生变化。

为了使 WPF 的数据绑定能够响应属性值的变化,并自动更新界面,需要实现 INotifyPropertyChanged 接口。这个接口用于通知数据绑定引擎某个属性的值已经改变,从而引擎可以更新绑定到该属性的 UI 元素。

以下详细说明:

实现INotifyPropertyChanged接口

在这个类(上面的例子中是``MainWindow)中实现 INotifyPropertyChanged接口,需要声明一个PropertyChanged` 事件:

public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
}

定义 RaisePropertyChanged 函数:

private void RaisePropertyChanged(string propertyChanged)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyChanged));
}
  • 这个函数用于触发 PropertyChanged 事件。
  • 当某个属性的值被改变时,我们只需要调用这个方法,传递属性的名字作为参数,这样界面就会发生更新。

修改属性以触发 PropertyChanged 事件

private string _UserName = "333";
public string UserName
{
get { return _UserName; }
set
{
if (_UserName != value)
{
_UserName = value;
RaisePropertyChanged(nameof(UserName));
}
}
}
  • 对于需要绑定的每个属性,我们就不再使用原本自动实现的属性(原本的是自动生成的,只需要写{ get; set; }就行。
  • 而是,首先需要给每个属性创建一个私有字段(在这个案例中就叫 _UserName)。
  • 在属性的 set 访问器中,我们设置字段的值,并且调用 RaisePropertyChanged 方法,可以达到一旦变量改变,就更新界面的效果。

可以输入propfull然后按 Tab 键两次,一键生成以下代码模板:

private int myVar;

public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}

然后可以根据需要修改类型(int)、字段名(myVar)和属性名(MyProperty)。对于上面的 INotifyPropertyChanged 的情况,还需要在 set 访问器中添加属性值变化通知的代码。

总结

绑定

例如绑定文本框的文字内容到UserName

<TextBox Text="{Binding UserName}"/>

在后端中写入:

public string UserName { get; set; }

可以输入prop使用代码模板。

初值

直接赋值

public string UserName { get; set; }

但是注意将窗口的 DataContext 设置为窗口本身的实例

public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}

实时更新

声明 PropertyChanged 事件:

public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
}

定义 RaisePropertyChanged 函数:

private void RaisePropertyChanged(string propertyChanged)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyChanged));
}

修改属性触发更新事件

private string _UserName = "333";
public string UserName
{
get { return _UserName; }
set
{
if (_UserName != value)
{
_UserName = value;
RaisePropertyChanged(nameof(UserName));
}
}
}

可以输入propfull使用代码模板。

WPF绑定与通知属性到界面的更多相关文章

  1. WPF 绑定到静态属性(4.5)

    1. 声明静态事件 /// <summary> /// 静态属性通知 /// </summary> public static event EventHandler<Pr ...

  2. WPFS数据绑定(要是后台类对象的属性值发生改变,通知在“client界面与之绑定的控件值”也发生改变须要实现INotitypropertyChanged接口)

    WPFS数据绑定(要是后台类对象的属性值发生改变,通知在"client界面与之绑定的控件值"也发生改变须要实现INotitypropertyChanged接口) MainWindo ...

  3. WPF绑定之索引器值变化通知

    背景 在某些应用中,需要在界面上绑定到索引器,并在值发生变化时实时更新. 解决方案 只要将包含索引器的类实现INotifyPropertyChanged接口,并在索引值更改时引发PropertyCha ...

  4. WPF PropertyChanged实现子属性通知

    今天用WPF的View绑定了ViewModel的一个属性类,结果在属性类的子属性修改时,没有通知到UI. 如有要显示一个学生信息,采用WPF MVVM的模式,则前端代码 <StackPanel& ...

  5. WPF 数据绑定 1_1 基础知识&绑定到元素属性

    A.数据绑定基础: 数据源对象:WPF将从该对象中提取信息,交由目标对象进行显示. 目标对象:从数据源中提取信息,并赋给该对象的属性. B.绑定到元素属性 最简单的绑定情形则是将一个源对象指定为一个W ...

  6. WPF绑定xaml中绑定对象需用属性表示,字段不可以绑定

    在练习WPF绑定时发现对象属性可以在XAML中绑定,但字段是不可以绑定: 比如: private Person person{get;set;}  可以绑定到XAML中,<TextBox Nam ...

  7. WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了

    原文:WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4 ...

  8. WPF UserControl 的绑定事件、属性、附加属性

    原文:WPF UserControl 的绑定事件.属性.附加属性 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Vblegend_2013/arti ...

  9. WPF 绑定父类属性

    原文:WPF 绑定父类属性 1.绑定父控件的属性. <ContextMenu x:Key="ContextMenuColoum"> <MenuItem Heade ...

  10. WPF 绑定属性 XAML 时间格式化

    原文:WPF 绑定属性 XAML 时间格式化 XAML 时间格式化{Binding Birthday,StringFormat='yyyy-MM-dd '} public class AssetCla ...

随机推荐

  1. Web前端入门第3问:前端需要学习哪些技术?

    Web前端开发技术学习路径 基础知识 必备 HTML+CSS+JavaScript ,就目前来看,这三板斧是入门前端开发的门槛,无论如何都是逃不掉了. 进阶知识 必须会一门主流的前端框架,比如:Rea ...

  2. Linux重启php-fpm

    前言 PHP-FPM 是一款简单好用的 PHP FastCGI 进程管理工具. 它可以和 Apache.Nginx 或其他服务器一起构建完整的 PHP 环境. 接下来我们看看在更改了 php.ini ...

  3. FastAPI测试策略:参数解析单元测试

    扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长 探索数千个预构建的 AI 应用,开启你的下一个伟大创意 第一章:核心测试方法论 1.1 三层测试体系架构 # 第一层:模型级测试 def ...

  4. docx4j转换HTML并生成word文档实践

    一.背景 在项目开发中,有一个需求需要将富文本编辑器中的内容转换为word文档.在网上看了很多开源第三方工具包的对比,最终选择了docx4j,主要原因有一下几点: 可以将html转换为word 对wo ...

  5. luogu-P5320题解

    简要题意 设 \(f(n)\) 表示用多米诺骨牌恰好铺满 \(2\times n\) 的平面的方案数,\(g(n)\) 表示用多米诺骨牌恰好铺满 \(3\times n\) 的平面的方案数:设 \(F ...

  6. Chrome 135 版本新特性

    Chrome 135 版本新特性 一.Chrome 135 版本浏览器更新 ** 1. 第三方托管账户注册迁移到 OIDC 授权码流程** Chrome 135 将账户注册的登录页面从营销网站迁移到动 ...

  7. Nginx+Windows搭建域名访问环境, 由nginx --> 网关 ---> 服务

    1).修改windows hosts文件改变本地域名映射,将gulimall.com映射到虚拟机ip 2).修改nginx的根配置文件nginx.conf,将upstream映射到我们的网关服务 up ...

  8. 理解tomcat中的BIO、NIO、AIO、ARP

    理解tomcat中的BIO.NIO.AIO.ARP tomcat作为springboot中默认的web容器,了解tomcat的运转可以帮助我们更好的去调整tomcat的参数达到更好的性能 前置知识 I ...

  9. kettle介绍-Step之If field value is null

    If field value is null介绍 替换NULL值步骤可以将输入流中所有字段的空值进行替换,也可以指定一种类型下的空值进行替换,还可以指定一个字段下的空值进行替换 三种替换NULL模式 ...

  10. 题解:AT_abc369_d [ABC369D] Bonus EXP

    题目大意: 有 nnn 个怪物,每个怪物有一个战力值 aia_iai​ ,你可以选择击败他或放走他,放走他没有经验值,击败他可以获得 aia_iai​ 的经验值,如果击败的数量是偶数,则还可以获得 a ...