属性通知之INotifyPropertyChanged
为什么后台绑定的值改变了前台不发生变化了?
针对这个初学者很容易弄错的问题,这里介绍一下INotifyPropertyChanged的用法
INotifyPropertyChanged:用于绑定属性更新
- /// <summary>
- /// 实体基类,实现了属性通知
- /// </summary>
- public class BaseEntity : INotifyPropertyChanged
- {
- public event PropertyChangedEventHandler PropertyChanged;
- /// <summary>
- /// 触发属性通知
- /// 这里用了一个特性的小技巧,就是CallMemberName
- /// 通过反射来获取调用者的名称,从而避免每一次调用方法都需要将属性名称传入方法
- /// </summary>
- /// <param name="propertyName"></param>
- [NotifyPropertyChangedInvocator]
- protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
- {
- var handler = PropertyChanged;
- if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
- }
- }
学生类继承自实体基类,通过继承的OnPropertyChanged方法来通知属性已经发生改变
- /// <summary>
- /// 学生类
- /// </summary>
- public class Student : BaseEntity
- {
- private string _name;
- /// <summary>
- /// 名字
- /// </summary>
- public string Name
- {
- get { return _name; }
- set
- {
- _name = value;
- OnPropertyChanged();
- }
- }
- private int _age;
- /// <summary>
- /// 年龄
- /// </summary>
- public int Age
- {
- get { return _age; }
- set
- {
- _age = value;
- OnPropertyChanged();
- }
- }
- private double _score;
- /// <summary>
- /// 分数
- /// </summary>
- public double Score
- {
- get { return _score; }
- set
- {
- _score = value;
- OnPropertyChanged();
- }
- }
- }
在ViewModel中声明一个Student,并且生成相应事件
- public class MainWindowViewModel
- {
- public Student LiLei { get; set; }
- public MainWindowViewModel()
- {
- InitStudentInfo();
- StartUpdateScore();
- }
- //初始化学生信息
- private void InitStudentInfo()
- {
- LiLei = new Student
- {
- Name = "李雷",
- Age = ,
- Score = 91.5
- };
- }
- //开始更新分数
- private void StartUpdateScore()
- {
- //定义一个定时器,改变分数值,若小于100分,那么增加,否则将到达一个特定分数
- var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds() };
- timer.Tick += (sender, e) =>
- {
- if (LiLei.Score < )
- {
- LiLei.Score++;
- }
- else
- {
- LiLei.Score = 89.5;
- }
- };
- timer.Start();
- }
- }
前台Xaml
- <Grid>
- <StackPanel>
- <TextBlock>
- <Run Text="姓名:"/>
- <Run Text="{Binding LiLei.Name}"/>
- </TextBlock>
- <TextBlock>
- <Run Text="年龄:"/>
- <Run Text="{Binding LiLei.Age}"/>
- </TextBlock>
- <TextBlock>
- <Run Text="分数:"/>
- <Run Text="{Binding LiLei.Score}"/>
- </TextBlock>
- </StackPanel>
- </Grid>
后台绑定
- public MainWindow()
- {
- InitializeComponent();
- this.DataContext = new MainWindowViewModel();
- }
效果图:
一个简单是示意例子,其实在大部分的Mvvm框架中,都有一些类是实现了属性通知的,会有相应的方法可以调用,一般不用自己去实现INotifyPropertyChanged接口
属性通知之INotifyPropertyChanged的更多相关文章
- wpf 属性变更通知接口 INotifyPropertyChanged
在wpf中将控件绑定到对象的属性时, 当对象的属性发生改变时必须通知控件作出相应的改变, 所以此对象需要实现 INotifyPropertyChanged 接口 例: //实现属性变更通知接口 INo ...
- 属性通知之ObservableCollection
单个属性是如何去通知,在上一章已经介绍过了,那么集合如何做到属性通知呢?这里要介绍ObservableCollection<T>,字面意思就是用于观察的集合. msdn上给出的定义是:表示 ...
- WPF PropertyChanged实现子属性通知
今天用WPF的View绑定了ViewModel的一个属性类,结果在属性类的子属性修改时,没有通知到UI. 如有要显示一个学生信息,采用WPF MVVM的模式,则前端代码 <StackPanel& ...
- 属性更改通知(INotifyPropertyChanged)——针对ObservableCollection
问题 在开发webform中,wpf中的ObservableCollection<T>,MSDN中说,在添加项,移除项时此集合通知控件,我们知道对一个集合的操作是CURD但是恰恰没有Upd ...
- Android之Bean属性通知类
调用: import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import android. ...
- INotifyPropertyChanged 接口 CallerMemberName属性
调用方信息 使用调用方信息属性,可以获取关于调用方的信息传递给方法. 可以获取源代码.行号在源代码和调用方的成员名称的文件路径. 此信息用于跟踪,调试和创建诊断工具非常有用.若要获取此信息,则使用适用 ...
- 【WPF学习笔记】之WPF基础:依赖关系属性和通知
这些天来,对象似乎已经忙得晕头转向了.每个人都希望它们做这做那.Windows® Presentation Foundation (WPF) 应用程序中的典型对象会接到各种各样不同的请求:有要求绑定到 ...
- Fody,告别烦人的INotifyPropertyChanged,最简方式实现通知!
INotifyPropertyChanged 我不是针对谁,我是说在座的各位 相信所有学wpf的,都写过类似下面的代码: 实现INotifyPropertyChanged public class M ...
- 如何优雅的实现INotifyPropertyChanged接口
INotifyPropertyChanged接口在WPF或WinFrom程序中使用还是经常用到,常用于通知界面属性变更.标准写法如下: class NotifyObject : INotifyProp ...
随机推荐
- XE8 hash
c++builder xe8 hash calc md5.sha256.sha384.sha512 file and string sha256.sha384.sha512 must call l ...
- 安装Win7和Office2010并激活
1. 下载Win7 建议安装原版的win7 SP1 64位中文旗舰版,不建议安装Ghost版本,之前用U盘安装Ghost版本一直失败.原版的下载地址为,选其中一个地址下载就行了. ed2k://|fi ...
- cocos2d-x 知识小结(1)zorder和tag
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...
- Win7系统下利用U盘安装Ubuntu14.04麒麟版
转自http://www.360doc.cn/article/14743053_335473181.html 重要提示:在采用u盘安装ubuntu分区时,所有磁盘一定要全部设置成逻辑分区,包括根目录/ ...
- [iOS微博项目 - 2.2] - 在app中获取授权
github: https://github.com/hellovoidworld/HVWWeibo A.发送授权请求 1.使用UIWebView加载请求页面 自定义一个继承UIViewContr ...
- 通过css代码使边框变圆角(ie9以下浏览器不支持)
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-02-11) CSS代码: <style> #myDiv { border-radius: 4px; /*这句就是 ...
- js 如何验证字符串里是否包含汉字?
1.用正则表达式判断<input type="text" id="name" placeholder="请输入用户名" value= ...
- jquery与ajax应用
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 学习JQuery中文文档之get()函数
前端大神群的群主告诉我们:学习一个框架最好的方法是去把官方文档研究一遍. 现在正式开始我的前端之路,从JQuery的中文文档开始. 基础不牢固,看起来有点慢,但是我会一直坚持下去的.把遇到的问题都记录 ...
- ThreadPool for Delphi
http://sourceforge.net/projects/threadpoolpas/ http://hivelocity.dl.sourceforge.net/project/threadpo ...