好吧,我最近實現了一個後臺工作來執行保存和加載數據。用MVVM中的後臺工作人員更新ObservableCollection
然而,得到這個在保存命令的工作已經證明很難。
基本上,我的save命令生成一個事件,通知集合視圖模型,項目已被添加和該項目應被添加到了自己的ObservableCollection。
在這一點上,我得到的通常的例外是說我不能更新在不同的線程的ICollection的。我試圖創建一個新的列表類型,調用Dispatcher.Invoke
,但是這仍然會產生相同的異常。
我不知道其他人是否對如何最好地解決這個有什麼建議?
所以目前我有一個類,從的ObservableCollection繼承:
public class ThreadSafeObservableCollection<T> : ObservableCollection<T>
{
public ThreadSafeObservableCollection(List<T> collection)
: base(collection)
{
dispatcher = Dispatcher.CurrentDispatcher;
rwLock = new ReaderWriterLock();
}
protected override void InsertItem(int index, T item)
{
if (dispatcher.CheckAccess())
{
if (index > this.Count)
return;
LockCookie c = rwLock.UpgradeToWriterLock(-1);
base.InsertItem(index, item);
rwLock.DowngradeFromWriterLock(ref c);
}
else
{
object[] obj = new object[] { index, item };
dispatcher.Invoke(
DispatcherPriority.Send,
(SendOrPostCallback)delegate { InsertItemImpl(obj); },
obj);
}
}
然後我有一個具有後臺工作,其執行保存視圖模型類。
一旦保存後,觸發一個事件到另一個視圖模型,以更新其列表。
protected override void OnObjectAddedToRepository(object sender, ObjectEventArgs<cdAdministrators> e)
{
Dispatcher x = Dispatcher.CurrentDispatcher;
var viewModel = new AdministratorViewModel(e.EventObject, DataAccess);
viewModel.RecentlyAdded = true;
viewModel.ItemSelected += this.OnItemSelected;
this.AllViewModels.Add(viewModel);
RecentlyAddedViewModel = viewModel;
OnPropertyChanged(null);
}
這兩個列表都是由單獨的後臺工作線程創建的。
喬恩您好,感謝您的回覆,我已經有一個集合對象,從ObserveableCollection繼承上InsertItem這確實Dispatcher.CheckAccess如果爲假,則不會Dispather.BeginInvoke,但是這仍然沒有工作? – jpgooner 2010-09-02 15:25:18
@jpgooner:你確定代碼實際上被使用了嗎?你能想出一個簡短但完整的例子來證明問題嗎? – 2010-09-02 16:09:09
我已經加入上面更詳細,讓我知道如果你需要了,我還是新來的StackOverflow – jpgooner 2010-09-02 16:32:17