Ok, gần đây tôi đã triển khai một nhân viên nền để thực hiện lưu và tải dữ liệu.Cập nhật một ObservableCollection với nhân viên nền trong MVVM
Tuy nhiên, việc này để làm việc trên lệnh lưu đã tỏ ra khó khăn. Về cơ bản, lệnh lưu của tôi tạo ra một sự kiện, thông báo cho một mô hình xem bộ sưu tập, rằng một Item đã được thêm vào và mục đó sẽ được thêm vào ObservableCollection của riêng nó.
Tại thời điểm này, tôi nhận được ngoại lệ thông thường nói rằng tôi KHÔNG thể cập nhật ICollection trên một chuỗi khác. Tôi đã thử tạo một loại danh sách mới gọi là Dispatcher.Invoke
, tuy nhiên điều này vẫn tạo ra cùng một ngoại lệ.
Tôi đã tự hỏi liệu có ai khác có bất kỳ đề xuất nào về cách tốt nhất để giải quyết vấn đề này không?
Vì vậy, hiện tại tôi có một lớp kế thừa từ 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);
}
}
sau đó tôi có một lớp xem mô hình mà có một nền công nhân thực hiện chức năng tiết kiệm.
Khi lưu xong, sự kiện sẽ được kích hoạt sang một mô hình chế độ xem khác để cập nhật danh sách của nó.
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);
}
Cả hai danh sách đều được tạo bởi một chuỗi công nhân nền riêng biệt.
Hi Jon, Cảm ơn trả lời của bạn, tôi đã có một đối tượng bộ sưu tập, mà kế thừa từ ObserveableCollection trên InsertItem này không Dispatcher.CheckAccess nếu sai thì không Dispather.BeginInvoke, tuy nhiên điều này vẫn chưa làm việc ?? – jpgooner
@jpgooner: Bạn có chắc chắn rằng mã thực sự đang được sử dụng không? Bạn có thể đưa ra một ví dụ ngắn nhưng đầy đủ để chứng minh vấn đề? –
Tôi đã bổ sung thêm chi tiết ở trên, hãy cho tôi biết nếu bạn cần nữa, tôi vẫn còn mới để stackoverflow – jpgooner