• 例子

先来看一个例子

Person.cs

  1. public class Person : ObservableObject,INotifyPropertyChanged
  2. {
  3. private string _testName;
  4. private ObservableCollection<string> _names=new ObservableCollection<string>();
  5.  
  6. public string TestName
  7. {
  8. get
  9. {
  10. return _testName;
  11. }
  12. set
  13. {
  14. _testName = value;
  15. OnPropertyChanged();
  16. }
  17. }
  18.  
  19. public ObservableCollection<string> Names
  20. {
  21. get { return _names; }
  22. set
  23. {
  24. _names = value;
  25. RaisePropertyChanged(()=>Names);
  26. }
  27. }
  28.  
  29. public event PropertyChangedEventHandler PropertyChanged;
  30.  
  31. protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
  32. {
  33. PropertyChangedEventHandler handler = PropertyChanged;
  34. if (handler != null)
  35. {
  36. handler(this, new PropertyChangedEventArgs(propertyName));
  37. }
  38. }
  39. }

MainWindow.xaml.cs

  1. public partial class MainWindow : Window, INotifyPropertyChanged
  2. {
  3. private int _currentId;
  4. private Person _person;
  5.  
  6. public Person Person
  7. {
  8. get
  9. {
  10. return _person;
  11. }
  12. set
  13. {
  14. _person = value;
  15. OnPropertyChanged();
  16. }
  17. }
  18.  
  19. public MainWindow()
  20. {
  21. InitializeComponent();
  22.  
  23. this.DataContext = this;
  24.  
  25. Person = new Person();
  26.  
  27. Person.TestName = "TestName";
  28. Person.Names.Add("string");
  29.  
  30. _currentId = Thread.CurrentThread.ManagedThreadId;
  31.  
  32. DispatcherHelper.Initialize();
  33. }
  34.  
  35. public event PropertyChangedEventHandler PropertyChanged;
  36.  
  37. protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
  38. {
  39. PropertyChangedEventHandler handler = PropertyChanged;
  40. if (handler != null)
  41. {
  42. handler(this, new PropertyChangedEventArgs(propertyName));
  43. }
  44. }
  45.  
  46. private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
  47. {
  48. Task.Factory.StartNew(() =>
  49. {
  50. if (_currentId == Thread.CurrentThread.ManagedThreadId)
  51. {
  52. Person = new Person();
  53. }
  54. else
  55. {
  56. //你认为属性能够更新到界面上吗?
  57. Person.TestName = "NotSame";
  58.  
  59. //集合呢?
  60. Person.Names.Add("Hello");
  61. }
  62. });
  63.  
  64. }
  65.  
  66. }

注意注释的地方

结果是TestName属性可以正确更新到UI上,而集合属性Names却不行(这里确实没有搞懂,求教之)。

其余的理解,有一篇写得很好

http://www.cnblogs.com/wpcockroach/p/3909081.html

WPF Binding INotifyPropertyChanged 多线程 深入理解的更多相关文章

  1. WPF入门教程系列(二) 深入剖析WPF Binding的使用方法

    WPF入门教程系列(二) 深入剖析WPF Binding的使用方法 同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProp ...

  2. WPF Binding

    winform有binding, WPF也有binding,区别在哪呢?这里暂时不提.以前也检查接触WPF binding, 但为什么过段时间就忘记了呢? 可能主要原因自己的知识体系不够完善吧,下面我 ...

  3. 拒绝卡顿——在WPF中使用多线程更新UI

    原文:拒绝卡顿--在WPF中使用多线程更新UI 有经验的程序员们都知道:不能在UI线程上进行耗时操作,那样会造成界面卡顿,如下就是一个简单的示例: public partial class MainW ...

  4. WPF使用 INotifyPropertyChanged 实现数据驱动

    如下图,有这么一个常见需求,在修改表单明细的苹果价格时,总价会改变,同时单据总和也随之改变. 按照Winfrom事件驱动的思想来做的话,我们就需要在将UI的修改函数绑定到CellEdit事件中来实现. ...

  5. WPF binding 参考

    Introduction This is an article on WPF Binding Cheat Sheet. Some of the Binding won't work for Silve ...

  6. WPF Binding值转换器ValueConverter使用简介(二)-IMultiValueConverter

    注: 需要继承IMultiValueConverter接口,接口使用和IValueConverter逻辑相同. 一.MultiBinding+Converter 多值绑定及多值转换实例 当纵向流量大于 ...

  7. WPF Binding值转换器ValueConverter使用简介(一)

    WPF.Silverlight及Windows Phone程序开发中往往需要将绑定的数据进行特定转换,比如DateTime类型的时间转换为yyyyMMdd的日期,再如有一个值是根据另外多组值的不同而异 ...

  8. JavaScript可否多线程? 深入理解JavaScript定时机制(转载)

    说明:最近写 js 时需要用setinterval函数做定时操作,谁知道,刚开始后运行完好,但一段时间后他就抽风了,定时任务运行的时间间隔越来越短,频率加快,这是一个完全不能容忍的问题,带着一个可以出 ...

  9. (转载)Java多线程入门理解

    转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更 ...

随机推荐

  1. jQuery Form 表单提交插件-----ajaxSubmit() 的应用

    Form Plugin API 里提供了很多有用的方法可以让你轻松的处理表单里的数据和表单的提交过程. 测试环境:部署到Tomcat中的web项目. 一.ajaxSubmit() 介绍  立即通过AJ ...

  2. 烂泥:查看服务器的BIOS是否开启CPU虚拟化

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 有关CPU是否支持虚拟化,我们可以通过相关的命令和软件进行查看. 在windows系统下,我们可以使用CPU-Z这个软件,如下图: 在linux系统下, ...

  3. JS高级程序设计2nd部分知识要点7

    例子: <!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF- ...

  4. ubuntu下ROS安装时sudo rosdep init和rosdep update的解决方法

    问题: 在ubuntu上多次安装matlab选择合适的版本来调用摄像头,终于把系统搞坏了,重装系统后,ROS无法安装,每次安装到sudo rosdep init和rosdep update报错的问题, ...

  5. java自带命令工具

    jstat,这个工具很强大,可以监测Java虚拟机GC多方面的状态,具体参数含义参见此链接: ./jstat -gc 84012 1000 3 S0C    S1C    S0U    S1U     ...

  6. C++ pair用法

    Pair类型概述 pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同 1.定义(构造): 1 pair<int, double> p1; //使用默认构造函数 2 pair ...

  7. 内存流和null字节

    #include <stdio.h> #include <string.h> int main() { ]={}; FILE* fp = fmemopen(buf,," ...

  8. Cinder 调试 - cinder service 状态为 down

    1. 问题 我们经常会发现某个cinder service 的状态为 down.比如下面例子中 controller 上的 cinder-scheduler 和 block1 节点上 cinder-v ...

  9. [转]asp.net的ajax以及json

    本文转自:http://www.cnblogs.com/ensleep/p/3319756.html 来现在这家公司以前,从未接触过webform,以前在学校做的项目是php,java以及asp.ne ...

  10. [编]IoT The Internet of Things (IoT) 物联网

    物联网是新一代信息技术的重要组成部分.其英文名称是“The Internet of things”.由此,顾名思义,“物联网就是物物相连的互联网”.这有两层意思:第一,物联网的核心和基础仍然是互联网, ...