Tôi đang sử dụng bộ dữ liệu bộ công cụ wpf để hiển thị bộ sưu tập có thể quan sát của AccountViewModels.Cách giữ bộ sưu tập các mô hình và kiểu xem đồng bộ
Điều này là khi tôi xóa tài khoản khỏi lưới, tôi muốn xóa tài khoản khỏi ObservableCollection - để cung cấp phản hồi trực quan cho người dùng, nhưng tôi muốn danh sách mô hình tài khoản cơ bản vẫn giữ nguyên, chỉ với 'IsDeleted 'đặt cờ trên mô hình Tài khoản.
Sau đó, bất cứ khi nào thay đổi được thực hiện, dịch vụ của tôi sẽ biết tài khoản nào cần thêm/cập nhật hoặc xóa trong cơ sở dữ liệu.
Im thuê bao sự kiện CollectionChanged:
AccountViewModels.CollectionChanged += AccountsChanged;
và sau đó thiết lập mô hình isDeleted cờ viewmodels true bất cứ khi nào một cái gì đó được lấy ra:
private void AccountsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach (AccountViewModel model in e.NewItems)
{
model.PropertyChanged += accountPropertyChanged;
model.Account.IsNew = true;
}
}
if (e.OldItems != null)
{
foreach (AccountViewModel model in e.OldItems)
{
model.PropertyChanged -= accountPropertyChanged;
model.Account.IsDeleted = true;
}
}
}
nhưng rõ ràng điều này sau đó loại bỏ nó từ quan sát bộ sưu tập. Vì vậy, khi tôi cam kết các thay đổi, sẽ không có tài khoản nào được đặt với cờ IsDeleted. tức là họ đã bị xóa.
foreach (AccountViewModel acc in m_ViewModel.AccountViewModels)
{
WorkItem workItem = null;
if(acc.Account.IsNew)
workItem = new WorkItem("Saving new account: " + acc.AccountName, "Saving new account to the database",() => Service.AddAccount(acc.Account));
else if (acc.Account.IsDeleted)
workItem = new WorkItem("Removing account: " + acc.AccountName, "Setting account inactive in the database",() => Service.RemoveAccount(acc.Account));
else if(acc.Account.IsDirty)
workItem = new WorkItem("Updating account: " + acc.AccountName, "Updating account in the database",() => Service.UpdateAccount(acc.Account));
workItems.Add(workItem);
}
Vì vậy, điều này có nghĩa là tôi cần duy trì hai danh sách, một danh sách mô hình tài khoản và một bộ sưu tập quan sát khác của chế độ xem tài khoản? Điều này chỉ có vẻ khó chịu và phải có một cách tốt hơn để làm điều này.
Nếu tôi đi tuyến đường này, làm thế nào để nắm bắt những thay đổi sự kiện bất động sản khi một trong số các trường trong mô hình của tôi được chỉnh sửa trong lưới. Tôi không thực sự muốn mô hình miền của tôi phải thực hiện INotifyPropertyChanged, đây là cái gì mà viewmodel của tôi đã làm trước đó. – cjroebuck
Đó là những gì tôi muốn nói khi tôi nói rằng bạn cần phải có * một số cơ chế tổ chức sự kiện nào đó. Hoặc bạn có thể tăng sự kiện từ Mô hình miền của mình (nó không cần phải là INotifiedPropertyChanged - nó có thể là sự kiện tùy chỉnh thay thế) hoặc bạn cần thông báo rõ ràng cho Bộ sưu tập dự án về thay đổi để có thể nâng cao sự kiện chính xác. Một lựa chọn thứ ba là có bộ sưu tập Projecting Polling cho những thay đổi trong mô hình cơ bản, nhưng con đường đó đầy nguy hiểm ... –