Một người có nên liên kết DataGrid
với
ICollectionView = CollectionViewSource.GetDefaultView(collection)
hoặc với
ObservableCollection<T> collection;
???
Cách thực hành tốt nhất cho MVVM là gì và tại sao?
Một người có nên liên kết DataGrid
với
ICollectionView = CollectionViewSource.GetDefaultView(collection)
hoặc với
ObservableCollection<T> collection;
???
Cách thực hành tốt nhất cho MVVM là gì và tại sao?
Câu trả lời:
Bạn luôn ràng buộc với một ICollectionView
, cho dù bạn có nói rõ ràng hay không.
Giả sử rằng chúng ta có
var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);
Trong trường hợp này, ràng buộc với collection
hoặc với collectionView
là một và giống nhau: công cụ liên kết sẽ liên kết với chế độ xem bộ sưu tập mặc định (có giá trị tham chiếu bằng collectionView
) nếu bạn yêu cầu nó liên kết với collection
.
Điều này có nghĩa là câu trả lời cho câu hỏi của bạn là "hoàn toàn không có gì khác biệt".
Chỉ cần hoàn toàn rõ ràng: ngay cả khi bạn liên kết trực tiếp với bộ sưu tập, công cụ liên kết sẽ liên kết với chế độ xem mặc định. Việc sửa đổi các thuộc tính của dạng xem, chẳng hạn như tiêu chí sắp xếp sẽ ảnh hưởng đến liên kết dường như liên kết trực tiếp với bộ sưu tập, vì đằng sau các bìa đó là ràng buộc đối với chế độ xem mặc định.
Tuy nhiên, có một câu hỏi thú vị và liên quan khác: người ta có nên liên kết với chế độ xem bộ sưu tập mặc định (tức là, với chính bộ sưu tập, vì không có lý do gì để liên kết rõ ràng với chế độ xem mặc định) hay với một chế độ xem khác của cùng một bộ sưu tập?
Xem xét rằng mỗi chế độ xem có khái niệm riêng về mục hiện tại, tiêu chí sắp xếp, v.v., theo đó, nếu bạn định có nhiều liên kết với cùng một bộ sưu tập và các điều khiển liên kết cần phải có khái niệm riêng biệt về mục, bộ lọc và công ty hiện tại, thì những gì bạn muốn là liên kết rõ ràng với nhiều chế độ xem của cùng một tập hợp cơ bản.
ObservableCollection<T>
triển khai INotifyCollectionChanged
và sẽ thông báo cho UI khi các mục trong bộ sưu tập đã được thay đổi.
ICollectionView
sẽ cung cấp cho bạn khả năng lọc, sắp xếp hoặc nhóm tập hợp ngoài việc đề xuất INotifyCollectionChanged
các sự kiện nếu tập hợp bên dưới triển khai nó.
Một trong hai loại hoạt động tốt với MVVM miễn là bạn liên kết với nó. Sử dụng ICollectionView
khi bạn cần sắp xếp, lọc hoặc nhóm. Sử dụng ObservableCollection<T>
trực tiếp khi bạn không sử dụng.
Chỉ để thêm vào những gì Jon đã nói. Sự khác biệt chính là bằng cách sử dụng CollectionViewSource.GetDefaultView(collection)
, bạn đang làm cho ViewModel của bạn phụ thuộc vào WPF. Nhiều người theo chủ nghĩa thuần túy MVVM không thích điều này và điều này sẽ chỉ để lại tùy chọn hợp lệ cho ObservableCollection.
Tùy chọn khác sẽ là sử dụng ICollectionView
và sử dụng một lớp, triển khai nó, nhưng không phải là một phần của chính WPF.
Tôi không nghĩ vì vậy nó phải làm bất cứ điều gì với MVVM
chính nó. ICollectionView
cung cấp các tính năng bổ sung như phân nhóm soring, v.v. nếu bạn cần những thứ đó, IColectionView
nếu không, chỉ cần sử dụngObservableCollection
Bạn sẽ liên kết với chế độ xem nếu bạn muốn lưới của mình hiển thị các cài đặt được áp dụng cho chế độ xem, ví dụ như lọc, nếu không thì chế độ xem là thừa.