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