2010-01-26 27 views
9

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.

Trả lời

3

Tôi không nghĩ rằng bạn có thể làm điều này tốt hơn với ObservableCollection, vì lớp đó giữ danh sách đối tượng nội bộ của riêng nó.

Tuy nhiên, nếu bạn triển khai Bộ sưu tập tùy chỉnh triển khai INotifyCollectionChanged và INotifyPropertyChanged, bạn có thể cho phép nó bao bọc và lọc bộ sưu tập nguồn của bạn.

Bộ lọc có thể lọc trên cờ IsDeleted để chúng không hiển thị.

Bất cứ khi nào người dùng xóa mục, bạn có thể sửa đổi Mô hình miền trực tiếp, đặt cờ IsDeleted thành true. Tuy nhiên, bạn vẫn sẽ cần một cơ chế tổ chức sự kiện để có thể nâng cao các sự kiện thích hợp, nhưng với cách tiếp cận đó, bạn chỉ có một bộ sưu tập các mục.

Bộ sưu tập tùy chỉnh chỉ đơn giản là Bản chiếu trên Mô hình miền, với các sự kiện được thêm vào.

+0

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

+0

Đó 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 ... –

Các vấn đề liên quan