2011-11-03 21 views
5

Metin kutusuna bağlanan bir özellikte INotifyPropertyChanged kullandığım bir wpf projem var. Bu değeri görev (TaskParallelLibrary) kullanarak farklı bir iş parçacığında güncelleştiriyorum. Düzgün güncellenir ve bir istisna atar. UI iş parçacığı değil, bir arka plan iş parçacığı üzerinde çalışıyor çünkü bir özel durum fırlatacağını düşünüyorum. Doğrudan UI öğesini kullanırsam, bir istisna atar. Yani, INotifyPropertyChanged bağlama mekanizması otomatik olarak UI iş parçacığına gönderme ilgilenir mi?Görev paralel kitaplığı INotifyPropertyChanged Bir istisna atmıyor musunuz?

Özellik kodum benim.

private string _textProperty = ""; 
    public string TextProperty 
    { 
     get 
     { 
      return _textProperty; 
     } 
     set 
     { 
      if (_textProperty != value) 
      { 
       _textProperty = value; 
       NotifyPropertyChanged("TextProperty"); 
      } 
     } 
    } 

ve benim görev oluşturma

var task = new Task(() => 
     { 
      TextProperty = "ABCD"; // Works. 
      // txtBox.Text = "ABCD"; // Throws an exception. 
     }); 
     task.Start(); 

ve XAML metin kutusu afin iplik değil tek özelliklerine Bağlama <TextBox Name="txtBox" Text="{Binding TextProperty}"/>

cevap

6

UI iş parçacığı değil arka plan iş parçacığı üzerinde çalıştığı için bir istisna atacağını düşünüyordum.

WPF, bir arka plan iş parçacığında bir sınır değeri ayarlamanıza olanak tanır. Bu sizin için UI iş parçacığı için sıralama işleyecek.Bu koleksiyonun öğeleri için çalışmasa da dikkat edin. Örneğin, bağlı olan bir ObservableCollection<T>'a eklemek isterseniz, UI iş parçacığına geri dönmeniz gerekir. Bununla birlikte, various workarounds vardır, bu da gerekirse bunu kolaylaştırabilir. Gelecekte WPF'deki çok iş parçacıklı gelişmeyi kolaylaştıracak olan this behavior changes in WPF 4.5.

+1

+1. WPF 4.5'e ilginç bağlantı. Şu anda WPF hakkında sevmediğim bazı şeyleri sıralamış gibi görünüyor. – RichardOD

+0

@Reed Wpf, güncellemeleri sizin için nasıl geliştirdiğini anlamak için elinizde bir referansınız var mı? –

1

olduğunu. Bunu sorunsuz bir şekilde yapabilirsiniz, bağlayıcı sizin için gerekli olanı yapar.
Ancak dikkat edin, bu yalnızca tek bir özellik bağlaması içindir. Örnegin bir ObservableCollection varsa, koleksiyon ciltleme yoluyla bagli olmasina ragmen, baska bir parçanin ögelerini ekleyemez ya da kaldıramazsiniz!

İlgili konular