私は WPF アプリケーションに取り組んでおり、バインドされたプロパティのプロパティ変更通知がバックグラウンド スレッドから発生する可能性があることがわかりましたが、observablecollection (アイテムの追加や削除など) を変更するには、UI スレッドから発生する必要があります。私の質問は、なぜそうなのですか?INotifyPropertyChanged と INotifyCollectionChanged の両方が UI コントロールによってサブスクライブされているのに、なぜ INotifyPropertyChanged の例外が発生するのでしょうか?
例えば:
public class ViewModel : INotifyPropertyChanged
{
ObservableCollection<Item> _items = new ObservableCollection<Item>();
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
//Can fire this from a background thread without any crash and my
//Name gets updated in the UI
InvokePropertyChanged(new PropertyChangedEventArgs("Name"));
}
}
public void Add(Item item)
{
//Cant do this from a background thread and has to marshal.
_items.Add(item);
}
public event PropertyChangedEventHandler PropertyChanged;
public void InvokePropertyChanged(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, e);
}
}
注: バックグラウンド スレッドからの CollectionChanged イベントはアプリをクラッシュさせますが、バックグラウンド スレッドからの PropertyChanged イベントは問題なく UI を更新します。はい、これは .NET 4.0 にあります。