为什么后台绑定的值改变了前台不发生变化了?

针对这个初学者很容易弄错的问题,这里介绍一下INotifyPropertyChanged的用法

INotifyPropertyChanged:用于绑定属性更新

  1. /// <summary>
  2. /// 实体基类,实现了属性通知
  3. /// </summary>
  4. public class BaseEntity : INotifyPropertyChanged
  5. {
  6. public event PropertyChangedEventHandler PropertyChanged;
  7.  
  8. /// <summary>
  9. /// 触发属性通知
  10. /// 这里用了一个特性的小技巧,就是CallMemberName
  11. /// 通过反射来获取调用者的名称,从而避免每一次调用方法都需要将属性名称传入方法
  12. /// </summary>
  13. /// <param name="propertyName"></param>
  14. [NotifyPropertyChangedInvocator]
  15. protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
  16. {
  17. var handler = PropertyChanged;
  18. if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
  19. }
  20. }

学生类继承自实体基类,通过继承的OnPropertyChanged方法来通知属性已经发生改变

  1. /// <summary>
  2. /// 学生类
  3. /// </summary>
  4. public class Student : BaseEntity
  5. {
  6. private string _name;
  7.  
  8. /// <summary>
  9. /// 名字
  10. /// </summary>
  11. public string Name
  12. {
  13. get { return _name; }
  14. set
  15. {
  16. _name = value;
  17. OnPropertyChanged();
  18. }
  19. }
  20.  
  21. private int _age;
  22.  
  23. /// <summary>
  24. /// 年龄
  25. /// </summary>
  26. public int Age
  27. {
  28. get { return _age; }
  29. set
  30. {
  31. _age = value;
  32. OnPropertyChanged();
  33. }
  34. }
  35.  
  36. private double _score;
  37.  
  38. /// <summary>
  39. /// 分数
  40. /// </summary>
  41. public double Score
  42. {
  43. get { return _score; }
  44. set
  45. {
  46. _score = value;
  47. OnPropertyChanged();
  48. }
  49. }
  50. }

在ViewModel中声明一个Student,并且生成相应事件

  1. public class MainWindowViewModel
  2. {
  3. public Student LiLei { get; set; }
  4.  
  5. public MainWindowViewModel()
  6. {
  7. InitStudentInfo();
  8. StartUpdateScore();
  9. }
  10.  
  11. //初始化学生信息
  12. private void InitStudentInfo()
  13. {
  14. LiLei = new Student
  15. {
  16. Name = "李雷",
  17. Age = ,
  18. Score = 91.5
  19. };
  20. }
  21.  
  22. //开始更新分数
  23. private void StartUpdateScore()
  24. {
  25. //定义一个定时器,改变分数值,若小于100分,那么增加,否则将到达一个特定分数
  26. var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds() };
  27. timer.Tick += (sender, e) =>
  28. {
  29. if (LiLei.Score < )
  30. {
  31. LiLei.Score++;
  32. }
  33. else
  34. {
  35. LiLei.Score = 89.5;
  36. }
  37. };
  38. timer.Start();
  39. }
  40. }

前台Xaml

  1. <Grid>
  2. <StackPanel>
  3. <TextBlock>
  4. <Run Text="姓名:"/>
  5. <Run Text="{Binding LiLei.Name}"/>
  6. </TextBlock>
  7. <TextBlock>
  8. <Run Text="年龄:"/>
  9. <Run Text="{Binding LiLei.Age}"/>
  10. </TextBlock>
  11. <TextBlock>
  12. <Run Text="分数:"/>
  13. <Run Text="{Binding LiLei.Score}"/>
  14. </TextBlock>
  15. </StackPanel>
  16. </Grid>

后台绑定

  1. public MainWindow()
  2. {
  3. InitializeComponent();
  4. this.DataContext = new MainWindowViewModel();
  5. }

效果图:

一个简单是示意例子,其实在大部分的Mvvm框架中,都有一些类是实现了属性通知的,会有相应的方法可以调用,一般不用自己去实现INotifyPropertyChanged接口

属性通知之INotifyPropertyChanged的更多相关文章

  1. wpf 属性变更通知接口 INotifyPropertyChanged

    在wpf中将控件绑定到对象的属性时, 当对象的属性发生改变时必须通知控件作出相应的改变, 所以此对象需要实现 INotifyPropertyChanged 接口 例: //实现属性变更通知接口 INo ...

  2. 属性通知之ObservableCollection

    单个属性是如何去通知,在上一章已经介绍过了,那么集合如何做到属性通知呢?这里要介绍ObservableCollection<T>,字面意思就是用于观察的集合. msdn上给出的定义是:表示 ...

  3. WPF PropertyChanged实现子属性通知

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

  4. 属性更改通知(INotifyPropertyChanged)——针对ObservableCollection

    问题 在开发webform中,wpf中的ObservableCollection<T>,MSDN中说,在添加项,移除项时此集合通知控件,我们知道对一个集合的操作是CURD但是恰恰没有Upd ...

  5. Android之Bean属性通知类

    调用: import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import android. ...

  6. INotifyPropertyChanged 接口 CallerMemberName属性

    调用方信息 使用调用方信息属性,可以获取关于调用方的信息传递给方法. 可以获取源代码.行号在源代码和调用方的成员名称的文件路径. 此信息用于跟踪,调试和创建诊断工具非常有用.若要获取此信息,则使用适用 ...

  7. 【WPF学习笔记】之WPF基础:依赖关系属性和通知

    这些天来,对象似乎已经忙得晕头转向了.每个人都希望它们做这做那.Windows® Presentation Foundation (WPF) 应用程序中的典型对象会接到各种各样不同的请求:有要求绑定到 ...

  8. Fody,告别烦人的INotifyPropertyChanged,最简方式实现通知!

    INotifyPropertyChanged 我不是针对谁,我是说在座的各位 相信所有学wpf的,都写过类似下面的代码: 实现INotifyPropertyChanged public class M ...

  9. 如何优雅的实现INotifyPropertyChanged接口

    INotifyPropertyChanged接口在WPF或WinFrom程序中使用还是经常用到,常用于通知界面属性变更.标准写法如下: class NotifyObject : INotifyProp ...

随机推荐

  1. XE8 hash

    c++builder  xe8 hash calc md5.sha256.sha384.sha512 file and string sha256.sha384.sha512  must call l ...

  2. 安装Win7和Office2010并激活

    1. 下载Win7 建议安装原版的win7 SP1 64位中文旗舰版,不建议安装Ghost版本,之前用U盘安装Ghost版本一直失败.原版的下载地址为,选其中一个地址下载就行了. ed2k://|fi ...

  3. cocos2d-x 知识小结(1)zorder和tag

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

  4. Win7系统下利用U盘安装Ubuntu14.04麒麟版

    转自http://www.360doc.cn/article/14743053_335473181.html 重要提示:在采用u盘安装ubuntu分区时,所有磁盘一定要全部设置成逻辑分区,包括根目录/ ...

  5. [iOS微博项目 - 2.2] - 在app中获取授权

    github: https://github.com/hellovoidworld/HVWWeibo   A.发送授权请求 1.使用UIWebView加载请求页面 自定义一个继承UIViewContr ...

  6. 通过css代码使边框变圆角(ie9以下浏览器不支持)

    (从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-02-11) CSS代码: <style> #myDiv { border-radius: 4px; /*这句就是 ...

  7. js 如何验证字符串里是否包含汉字?

    1.用正则表达式判断<input  type="text" id="name" placeholder="请输入用户名" value= ...

  8. jquery与ajax应用

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 学习JQuery中文文档之get()函数

    前端大神群的群主告诉我们:学习一个框架最好的方法是去把官方文档研究一遍. 现在正式开始我的前端之路,从JQuery的中文文档开始. 基础不牢固,看起来有点慢,但是我会一直坚持下去的.把遇到的问题都记录 ...

  10. ThreadPool for Delphi

    http://sourceforge.net/projects/threadpoolpas/ http://hivelocity.dl.sourceforge.net/project/threadpo ...