2012-01-01 19 views
5

Tôi đang làm việc trên so sánh hai phiên bản của một listview, cho một hình thức cài đặt. Tôi cần biết liệu người dùng có thực sự sửa đổi danh sách không, trong trường hợp đó khi họ nhấp vào "Lưu", tôi sẽ thực sự lưu. Nếu họ không thay đổi bất cứ điều gì, khi họ nhấp vào "Lưu" Tôi sẽ không lãng phí bộ nhớ/thời gian tái lưu một cái gì đó mà họ không thay đổi.So sánh hai ObservableCollection (s) để xem nếu chúng khác nhau

Dù sao, làm cách nào tôi có thể so sánh hai ObservableCollections để xem liệu chúng có khác biệt không?

Cảm ơn trước!

Trả lời

1

Cách mà chúng tôi xử lý yêu cầu nhiều công việc hơn một chút, nhưng nó có thể được tự động bằng cách sử dụng các macro VS hoặc các công cụ mã-gen như CodeSmith. Tuy nhiên, cách tiếp cận này có thể mở rộng đối với bất kỳ cấu trúc giao diện người dùng nào mà bộ sưu tập bị ràng buộc và không phải được triển khai lại trong giao diện người dùng mỗi khi bạn cần biết có thay đổi hay không.

Khái niệm này là cập nhật cờ trong bộ sưu tập và đối tượng kinh doanh để xác định liệu thành viên bộ sưu tập đã thay đổi hay bất kỳ bản ghi nào đã thay đổi trong bộ sưu tập.

Việc triển khai khá đơn giản:

Thêm thuộc tính HasChanged vào lớp đối tượng nghiệp vụ.

Thêm thuộc tính AnyDeleted vào bộ sưu tập. Điều này sẽ chỉ được đặt nếu các mục bị xóa khỏi bộ sưu tập.

Khởi tạo các giá trị này thành sai sau khi các bản ghi được đọc từ DB.

(Bây giờ phần bán tẻ nhạt) Đối với mỗi thuộc tính trong lớp, đặt thuộc tính HasChanged thành true nếu giá trị thực sự thay đổi. Hãy cẩn thận với các giá trị null. Ví dụ:

public bool IsSelected 
    { 
     get 
     { 
      return m_fIsSelected; 
     } 
     set 
     { 
      if (m_fIsSelected != value) 
      { 
       this.HasChanged = true; 
       m_fIsSelected = value; 
      } 
     } 
    } 

Sửa đổi các bộ sưu tập để thiết lập thuộc tính AnyDeleted để đúng khi kỷ lục này sẽ bị xóa:

protected override void RemoveItem(int index) 
    { 
     this.AnyDeleted = true; 

     base.RemoveItem(index); 
    } 

Cuối cùng, thêm một phương pháp để các bộ sưu tập để cho biết hay không bất cứ điều gì đã thay đổi. Đây là phương thức mà bạn sẽ gọi để xác định xem có cần lưu bất kỳ thay đổi nào hay không:

public bool HasAnyChanges() 
    { 
     // Exceptions are handled by the caller 

     // If anything was deleted, return true 
     if (this.AnyDeleted) 
     { 
      return true; 
     } 
     else 
     { 
      foreach (T theItem in this) 
      { 
       if (theItem.HasAnyChanges()) 
       { 
        return true; 
       } 
      } 
     } 

     return false; 
    } 
0

Edit:

void ListView_ItemInserted(Object sender, ListViewInsertedEventArgs e) 
    { 
    if (e.Exception == null) 
    { 
     if (e.AffectedRows > 0) 
     { 
     flag = True; 
     } 
     else 
     { 
     flag = False; 
     } 
    } 

void ListView_Itemdeleted(Object sender, ListViewDeletedEventArgs e) 
    { 
    if (e.Exception == null) 
    { 
     if (e.AffectedRows > 0) 
     { 
     flag = True; 
     } 
     else 
     { 
     flag = False; 
     } 
    } 


void ListView_ItemUpdated(Object sender, ListViewUpdatedEventArgs e) 
    { 
    if (e.Exception == null) 
    { 
     if (e.AffectedRows > 0) 
     { 
     flag = True; 
     } 
     else 
     { 
     flag = False; 
     } 
    } 

bạn có thể kiểm tra biến cờ này trước khi lưu. Điều này sẽ làm! nếu nó đúng, hãy cứu nó!

+0

Không có hai bản xem trước thực tế, chỉ một. – mattsven

+0

câu hỏi của bạn cho biết hai phiên bản danh sách xem! Vì vậy, ý của bạn là gì? Bạn đã một lần nữa đề cập đến việc so sánh hai! – King

+0

Bạn đang ràng buộc một listview vào một số cấu trúc dữ liệu như xml hoặc có nó như là chuỗi và sau đó lưu nó trong cài đặt? Có phải vậy không? @NeXXeuS Nếu tôi hiểu câu hỏi của bạn là như thế này. Sau đó, trừ khi ứng dụng có các thiết lập trong bộ nhớ và liên tục cập nhật nó, bạn sẽ phải đọc các thiết lập và thực hiện nó. Của nó nhiều như tiết kiệm nó. Tôi không nghĩ rằng nó sẽ tạo ra sự khác biệt về hiệu suất nếu nó là như vậy. – King

4

Bạn có thể sử dụng phương thức LINQ Ngoại trừ: Tạo ra sự khác biệt thiết lập của hai chuỗi.

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except.aspx

Xem xét các phương pháp mẫu sau ...

public void ExceptFunctioni() 
{ 
    int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 }; 
    int[] numbersB = { 1, 3, 5, 7, 8 }; 
    IEnumerable<int> aOnlyNumbers = numbersA.Except(numbersB); 
    if(aOnlyNumbers.Count()>0) 
    { 
     // do something 
    } 
} 

Các Trừ phương pháp được gọi vào bộ sưu tập đầu tiên và thông qua bộ sưu tập thứ hai như một cuộc tranh cãi. Kết quả sẽ chứa sự khác biệt. Sau đó, bạn có thể truy vấn kết quả và thực hiện hành động tương ứng. Nếu cả hai chuỗi đều bằng nhau, thì kết quả sẽ là 0.

Có nói rằng, đáng lưu ý rằng chiến lược ưa thích trong thế giới MVVM sẽ là sử dụng phương pháp này để kiểm soát việc nút 'Lưu' của bạn có được bật hay không. Trong phương pháp này, nếu hai bộ sưu tập bằng nhau, nút 'Lưu' sẽ bị vô hiệu hóa và người dùng không thể truy cập nó.

Nhưng một trong hai cách, phương pháp LINQ cung cấp một cách rất đặc để đạt được những gì bạn đang sau ...

THÊM: nhìn thấy những ý kiến ​​bạn đã thực hiện trong trả lời bình luận 'Dumb của', 'oldList' của bạn sẽ tương ứng với numbersB trong mã mẫu ở trên ...


Ngoài ra comment từ 'Stonetip' (mà nhờ) ...

More succinct: if(numbersA.Except(numbersB).Any()) { // do something } 
+0

Tôi nghĩ rằng những từ đó ít gây nhầm lẫn và "oldList là danh sách cũ (cài đặt hiện tại trước khi người dùng thay đổi chúng)" có nghĩa là anh ấy có thể nói rằng một từ đã được lưu vào cài đặt và danh sách hiện tại có nghĩa là không lưu. Anh ta có thể không có hai bộ sưu tập nhưng một bộ sưu tập đã được lưu (mà anh ta ảo hóa cho chúng tôi như một bộ sưu tập) và một bộ sưu tập trên listview. Nếu anh ta có cả hai bộ sưu tập trong bộ nhớ, sau đó nó tốt để sử dụng ngoại trừ phương pháp của LINQ. 1 để sử dụng LINQ (cách tiếp cận súc tích). Cho phép nghe từ anh ta về mô tả thêm về công việc của mình. – King

+0

@Dumb, chúc mừng năm mới! Bạn vui lòng sử dụng cơ sở 'chỉnh sửa' để sửa đổi phần khó hiểu sao cho nó rõ ràng? Bạn có nghĩa là các thiết lập không có nghĩa là phải kiên trì? –

+0

Chúc mừng năm mới! Tôi đang chờ anh ấy làm rõ hơn một chút để chúng tôi sẽ hiểu chính xác những gì anh ấy cần và chúng tôi có thể chỉnh sửa chúng. Vâng. Tôi có ý tưởng rằng dữ liệu của anh ta không liên tục. Nhưng chắc chắn hai phiên bản dường như không mạch lạc với những gì ông đã nói trong các bình luận! Vì vậy, Mebbe ông muốn kiểm tra mọi thứ một cái gì đó được thực hiện với listview, đó là lý do tại sao tôi đề nghị kiểm tra các sự kiện cho cách tiếp cận listview. Nhưng nếu anh ta có hai phiên bản của dữ liệu liên tục, tôi sẽ khuyên bạn nên sử dụng cách tiếp cận của bạn! – King

0

tôi thứ mực, bạn đang tập trung vào cách tiếp cận sai lầm. Bạn không nên so sánh nội dung của 2 danh sách được gắn với một ListView, cũng bởi vì số lượng các mục mà chúng chứa có thể cực kỳ lớn.

  • Nó tốt hơn để tập trung vào việc xác định một đơn (nếu có thể) và thống nhất cách để có thể thay đổi nội dung của một bộ sưu tập từ API, cung cấp cho người tiêu dùng lớp học của bạn một cách tổng quát để có thể thay đổi một cái gì đó trong bộ sưu tập. Nếu phương pháp đó được sử dụng, bạn có thể giữ một boolean flag xác định xem có thay đổi gì không.

  • Hoặc bạn có thể giả sử rằng nếu ai đó sử dụng phương pháp set bên trong thuộc tính tập hợp được ràng buộc, nghĩa là bộ sưu tập đã được thay đổi.

Nói cách khác, chuyển tiếp hoặc trên workflow được xác định trước của ứng dụng của bạn, hoặc xác định một API cho việc thay đổi nội dung, vì vậy bạn sẽ có thể tìm ra khinếu nội dung của các bộ sưu tập đã được thay đổi .

Và một khái niệm khác: không có ý nghĩa để cho người dùng nhấp vào Savekhông lưu. Nếu có thể nhấp vào Save lệnh do người dùng yêu cầu phải được thực thi. Nếu bạn lo lắng về hiệu suất (bạn không muốn lưu một cái gì đó, nếu nó không thay đổi từ lần lưu cuối cùng), vì vậy hãy vô hiệu hóa nút Save, nếu lưu không thích hợp. Nói cách khác, hãy điền UI và hoạt động như mong đợi bởi ứng dụng của bạn. Làm cho người dùng rõ ràng những gì ứng dụng hiện nay và những gì nó không.

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