zoukankan      html  css  js  c++  java
  • WPF Binding INotifyPropertyChanged 多线程 深入理解

    • 例子

    先来看一个例子

    Person.cs

    public class Person : ObservableObject,INotifyPropertyChanged
        {
            private string _testName;
            private ObservableCollection<string> _names=new ObservableCollection<string>();
    
            public string TestName
            {
                get
                {
                    return _testName;
                }
                set
                {
                    _testName = value;
                    OnPropertyChanged();
                }
            }
    
            public ObservableCollection<string> Names
            {
                get { return _names; }
                set
                {
                    _names = value;
                    RaisePropertyChanged(()=>Names);
                }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }

    MainWindow.xaml.cs

    public partial class MainWindow : Window, INotifyPropertyChanged
        {
            private int _currentId;
            private Person _person;
    
            public Person Person
            {
                get
                {
                    return _person;
                }
                set
                {
                    _person = value;
                    OnPropertyChanged();
                }
            }
    
            public MainWindow()
            {
                InitializeComponent();
    
                this.DataContext = this;
    
                Person = new Person();
    
                Person.TestName = "TestName";
                Person.Names.Add("string");
    
                _currentId = Thread.CurrentThread.ManagedThreadId;
    
                DispatcherHelper.Initialize();
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    
            private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
            {
                Task.Factory.StartNew(() =>
                {
                    if (_currentId == Thread.CurrentThread.ManagedThreadId)
                    {
                        Person = new Person();
                    }
                    else
                    {
                        //你认为属性能够更新到界面上吗?
                        Person.TestName = "NotSame";
    
                        //集合呢?
                        Person.Names.Add("Hello");
                    }
                });
    
    
            }
    
        }

    注意注释的地方

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

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

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

  • 相关阅读:
    什么叫工作到位?
    SQL中PIVOT 使用
    SQL中ROW_NUMBER() 使用
    Fiddler 抓包工具总结
    设计模式之单例模式
    数据库脏读、不可重复读、幻读
    SQL查询优化《四》:临时表和表变量的使用
    SQL查询优化《三》:少做重复的工作
    SQL查询优化《二》:只返回需要的数据
    SQL查询优化《一》:SQL语句执行顺序
  • 原文地址:https://www.cnblogs.com/HelloMyWorld/p/4287971.html
Copyright © 2011-2022 走看看