• 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

  • 相关阅读:
    剧集更新表
    Pyhton资源
    JAVA资源
    012 循环
    011 条件判断
    010 使用list和tuple
    009 字符串和编码
    007 Python基础
    python 内置函数
    python 获取当前运行的类名函数名inspect.stack()[1][3]
  • 原文地址:https://www.cnblogs.com/HelloMyWorld/p/4287971.html
Copyright © 2020-2023  润新知