2010-04-23 32 views
6

Tôi muốn làm điều gì đó mà tôi nghĩ sẽ rất đơn giản. Tôi muốn ràng buộc một EntityCollection Entity Framework được tạo ra với một DataGrid WPF. Tôi cũng muốn lưới này có thể sắp xếp được.Entity Framework 4.0 Databinding với phân loại không hoạt động

Tôi đã thử tất cả mọi thứ để thực hiện điều này, bao gồm cả việc sử dụng CollectionViewSource. Tuy nhiên, không có gì có vẻ hiệu quả. Sử dụng CollectionViewSource bình thường xung quanh EntityCollection cho tôi:

'System.Windows.Data.BindingListCollectionView' view does not support sorting. 

Ok ... lạ. Tôi đã nghĩ rằng điều này sẽ làm việc. Tiếp theo trên CollectionViewSource, tôi thử cài đặt:

CollectionViewType="ListCollectionView" 

Tuyệt vời, sắp xếp hoạt động. Nhưng chờ đợi, tôi không thể thêm hoặc loại bỏ các thực thể bằng cách sử dụng lưới ngay bây giờ, có lẽ vì ListCollectionView không hỗ trợ điều này với bối cảnh khung thực thể.

Vì vậy, tôi đoán tôi cần phải nắm bắt các sự kiện sắp ra khỏi DataGrid để thêm hoặc xóa các đối tượng theo cách thủ công khỏi ngữ cảnh của tôi. Bây giờ tôi không thể tìm thấy một sự kiện để chụp để phát hiện thêm ...!

Tại sao điều này quá khó? Đây sẽ là trường hợp "demo" chuẩn mà Microsoft nên thiết kế xung quanh.

Bất kỳ ý tưởng nào?

Trả lời

2

BindingListCollectionView không trực tiếp là vấn đề. Xem 'System.Windows.Data.BindingListCollectionView' view does not support sorting trên Microsoft Connect để biết chi tiết lý do tại sao nó không hỗ trợ sắp xếp.

Mặt khác, ListCollectionView hỗ trợ sắp xếp rõ ràng bằng cách sử dụng một kỹ thuật khác.

Tôi cũng đã thử mã sau và nó hoạt động rất đẹp. Tôi đã cơ bản thực hiện XAML của bạn từ the other post trong mã.

DatabaseContext.ObjectStateManager.ObjectStateManagerChanged += (o, args) => Debug.WriteLine(args.Element.ToString()); 

var collectionViewSource = new CollectionViewSource(); 
((ISupportInitialize)collectionViewSource).BeginInit(); 
collectionViewSource.CollectionViewType = typeof (ListCollectionView); 
collectionViewSource.Source = ((IListSource) DatabaseContext.Survey).GetList(); 
collectionViewSource.SortDescriptions.Add(new SortDescription {PropertyName = "Name"}); 
((ISupportInitialize)collectionViewSource).EndInit(); 

var editableCollectionView = (IEditableCollectionView)collectionViewSource.View; 
var survey = editableCollectionView.AddNew(); 

// Before this point ObjectStateManager event has occurred and Debug Output is written to. 

editableCollectionView.CommitNew(); 
DatabaseContext.SaveChanges(); // THIS WORKS TOO! 

My DatabaseContext.SurveyObjectQuery<Survey>. Bạn có đang hiển thị số ObjectQuery hoặc truy vấn LINQ-to-EF không? Điều này rõ ràng là phù hợp với tôi. Sau này là nơi tôi thấy một vấn đề. Đó không phải là nghĩa vụ phải làm việc.

+0

Có, ListCollectionView thực tế hoạt động. Tôi đã nhầm lẫn vì thêm vào điều này thông qua databinding đã không được thêm vào những gì tôi nghĩ là bộ sưu tập "root" mà tôi đã được ràng buộc để (myContext.Employees ví dụ). Tôi đã lầm tưởng rằng đây là những bộ sưu tập có thể thay đổi được, trong thực tế, chúng không phải, và cách duy nhất để có được các thực thể "mới" của tôi là thông qua ObjectStateManager. –

+0

Điều này thực sự dường như làm việc tuyệt vời. Thật đáng buồn là công cụ EF RAD mặc định không quan tâm đến hộp này. Điều đó nói rằng, hãy nhớ rằng nếu bạn đang sử dụng ListCollectionView CollectionViewType với EF4, bạn sẽ phải đặt AutoGenerateColumns thành False để tránh nhận các cột EntityState và EntityKey. – Spooles

0

Có vẻ như, Chế độ xem chỉ không nhận được thông báo, khi có thể xảy ra sự cố. Vì vậy, tôi chỉ cần làm

myCollectionViewSource.View.Refresh(); //refresh CollectionViewSource of CollectionViewType="ListCollectionView" 

sau khi thêm/xóa mục danh sách.

Nhưng khi đó toàn bộ trạng thái được làm mới (ví dụ: bạn phải đặt lại sắp xếp được chọn trước). Bạn cần phải kiểm tra, nếu điều này phù hợp với nhu cầu của bạn.

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