• 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

  • 相关阅读:
    Webstorm 2018|2019 官网各大版本破解永久有效
    如何在IDEA 中使用Git
    maven的安装与配置(本地仓库、阿里云镜像设置)
    如何设置使chrome新标签页中打开链接自动跳转到新标签页?
    VMware虚拟机安装Linux系统
    Git安装和使用
    Navicat Premium 12.0.18 安装与激活
    HBuilder mui 报错No 'Access-Control-Allow-Origin' header
    spring+redis 报错 org.springframework.core.serializer.support.DeserializingConverter.<init>(Ljava/lang/ClassLoader;)V
    JAVA 注解
  • 原文地址:https://www.cnblogs.com/HelloMyWorld/p/4287971.html
Copyright © 2020-2023  润新知