好吧,我最近实现了一个后台工作来执行保存和加载数据。用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