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;
}
在上面的例子中,UserName 是 MainWindow 的一个属性。通过将 DataContext 设置为 this(即 MainWindow 的当前实例),告诉了数据绑定引擎应该在当前的 MainWindow 实例中查找 UserName 属性。
这样,在 XAML 中使用 {Binding UserName} 的时候,它能正确地找到 MainWindow 的 UserName 属性,并将其与 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绑定与通知属性到界面的更多相关文章
- WPF 绑定到静态属性(4.5)
1. 声明静态事件 /// <summary> /// 静态属性通知 /// </summary> public static event EventHandler<Pr ...
- WPFS数据绑定(要是后台类对象的属性值发生改变,通知在“client界面与之绑定的控件值”也发生改变须要实现INotitypropertyChanged接口)
WPFS数据绑定(要是后台类对象的属性值发生改变,通知在"client界面与之绑定的控件值"也发生改变须要实现INotitypropertyChanged接口) MainWindo ...
- WPF绑定之索引器值变化通知
背景 在某些应用中,需要在界面上绑定到索引器,并在值发生变化时实时更新. 解决方案 只要将包含索引器的类实现INotifyPropertyChanged接口,并在索引值更改时引发PropertyCha ...
- WPF PropertyChanged实现子属性通知
今天用WPF的View绑定了ViewModel的一个属性类,结果在属性类的子属性修改时,没有通知到UI. 如有要显示一个学生信息,采用WPF MVVM的模式,则前端代码 <StackPanel& ...
- WPF 数据绑定 1_1 基础知识&绑定到元素属性
A.数据绑定基础: 数据源对象:WPF将从该对象中提取信息,交由目标对象进行显示. 目标对象:从数据源中提取信息,并赋给该对象的属性. B.绑定到元素属性 最简单的绑定情形则是将一个源对象指定为一个W ...
- WPF绑定xaml中绑定对象需用属性表示,字段不可以绑定
在练习WPF绑定时发现对象属性可以在XAML中绑定,但字段是不可以绑定: 比如: private Person person{get;set;} 可以绑定到XAML中,<TextBox Nam ...
- WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了
原文:WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4 ...
- WPF UserControl 的绑定事件、属性、附加属性
原文:WPF UserControl 的绑定事件.属性.附加属性 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Vblegend_2013/arti ...
- WPF 绑定父类属性
原文:WPF 绑定父类属性 1.绑定父控件的属性. <ContextMenu x:Key="ContextMenuColoum"> <MenuItem Heade ...
- WPF 绑定属性 XAML 时间格式化
原文:WPF 绑定属性 XAML 时间格式化 XAML 时间格式化{Binding Birthday,StringFormat='yyyy-MM-dd '} public class AssetCla ...
随机推荐
- NumPy学习11
今天学习了NumPy线性代数 21, NumPy线性代数 numpy_test11.py : import numpy as np ''' 21, NumPy线性代数 NumPy 提供了 numpy. ...
- Flask快速入门4-蓝图
十六,Flask 用蓝图实现模块化的应用 1,Flask 为什么使用蓝图? Flask 中的蓝图为这些情况设计: 把一个应用分解为一个蓝图的集合.这对大型应用是理想的.一个项目可以实例化 一个应用对象 ...
- 寻找可靠的长久的存储介质之旅,以及背后制作的三个网页“图片粘贴转base64”、“生成L纠错级别的QR码”、“上传文件转 base64以及粘贴 base64 转可下载文件”
其实对于目前的形式来说,虽然像 U 盘.固态硬盘.甚至光盘这些信息储存介质(设备)的容量越来越高,但是不得不说这些设备的可靠性依然像悬着的一块石头,虽然这块石头确实牢牢的粘在天花板上,但是毕竟是粘上去 ...
- React Props指南:从基础到高阶应用的最佳实践解析
在 React 中,Props(属性)是组件间通信和数据传递的核心机制.通过合理使用 Props,开发者可以构建动态.可复用且易于维护的组件体系.本文将深入探讨 Props 的核心概念.使用方法及最佳 ...
- 在 CentOS 系统下搭建 ZeroTier Moon
在 CentOS 系统下搭建 ZeroTier Moon 服务器时,生成的配置文件位置是在 /var/lib/zerotier-one/ 目录下.该目录包含了 ZeroTier One 的运行时数据, ...
- APEX实战第3篇:如何完善项目基础功能
上一篇<APEX实战第2篇:构建自己第一个APEX程序>虽然有了程序,但实在是太单薄! 本篇将会介绍一些数据库的基础知识,演示如何通过函数.触发器.存储过程.视图等来完善项目的一些基础功能 ...
- nodejs调用shell
shelljs https://github.com/shelljs/shelljs 实例 var shell = require('shelljs'); if (!shell.which('git' ...
- verilog利用线性插值实现正弦波生成器(dds)
verilog实现线性插值实现正弦波生成器 最近在项目上遇到一个需要在低资源FPGA上实现FFT逻辑的项目,而且要求实现窗函数.对于窗函数来说,莫非是实现正弦波生成器,正弦波生成器可以利用DDS模 ...
- pytorch 实战教程之 Feature Pyramid Networks (FPN) 特征金字塔网络实现代码
原文作者:aircraft 原文链接:pytorch 实战教程之 Feature Pyramid Networks (FPN) 特征金字塔网络实现代码 - aircraft - 博客园 学习YOLOv ...
- 36条技巧优化PHP代码(总结)
原文:38条技巧优化PHP代码 1.如果一个方法能被静态,那就声明他为静态的,速度可提高1/4; 2.echo的效率高于print,因为echo没有返回值,print返回一个整型; 3.在循环之前设置 ...