提高CollectionChanged我需要提高一個ObservableCollection的CollectionChanged事件的UI線程。的Silverlight和的ObservableCollection:在UI線程
我已經看到了不同的方法,從一個包裝類的相關接口的自定義實現。
有沒有什麼簡單的方法來覆蓋INotifyCollectionChanged上一個ObservableCollection做到這一點?
謝謝。
提高CollectionChanged我需要提高一個ObservableCollection的CollectionChanged事件的UI線程。的Silverlight和的ObservableCollection:在UI線程
我已經看到了不同的方法,從一個包裝類的相關接口的自定義實現。
有沒有什麼簡單的方法來覆蓋INotifyCollectionChanged上一個ObservableCollection做到這一點?
謝謝。
要做到這一點最簡單的方法是隻保證你從集合中添加/刪除項目的UI線程。這可以通過這個簡短的函數來完成:
private void AddItemsToCollection(List<whatever> newItems)
{
if (this.Dispatcher.CheckAccess())
{
newItems.ForEach(x => myObservableCollection.Add(x));
}
else
this.Dispatcher.BeginInvoke(new Action<List<whatever>>(AddItemsToCollection), newItems);
}
你可以子類的ObservableCollection和覆蓋OnCollectionChanged並使用correspending調度OnPropertyChanged方法馬歇爾事件回到UI線程。
public class DispatcherObservableCollection<T> : ObservableCollection<T>
{
Dispatcher _dispatcher;
public DispatcherObservableCollection(Dispatcher dispatcher)
{
if (dispatcher == null)
throw new ArgumentNullException("dispatcher");
_dispatcher = dispatcher;
}
protected override void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (!_dispatcher.CheckAccess())
{
_dispatcher.Invoke(
new Action<PropertyChangedEventArgs>(base.OnPropertyChanged), e);
}
else
{
base.OnPropertyChanged(e);
}
}
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (!_dispatcher.CheckAccess())
{
_dispatcher.Invoke(
new Action<NotifyCollectionChangedEventArgs>(base.OnCollectionChanged), e);
}
else
{
base.OnCollectionChanged(e);
}
}
}
非常好的主意。但是,只有在用BeginInvoke替換Invoke後,它才適用於我。 – 2011-01-02 23:01:29
謝謝,但我有很多事情發生在後臺(如異步加載操作等)。任何其他想法? – Derick 2010-10-06 04:59:46
我會給你一個建議。 – Derick 2010-10-06 05:42:18
@Derick - 那就是功能的美 - 這不要緊,你叫什麼的線程它,它會馬歇爾本身到UI線程(如果尚未有),它更新之前。 – slugster 2010-10-06 11:56:33