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

 

转载于:https://www.cnblogs.com/HelloMyWorld/p/4287971.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>