2009-05-30 8 views
21

Tôi có một DataGrid WPF với một số dữ liệu. Bạn có thể thêm hàng thông qua một cửa sổ riêng biệt. DataContext giống nhau, một đối tượng LINQ-to-SQL. Ràng buộc cũng giống nhau, tôi ràng buộc thuộc tính "ItemsSource" vào một bảng.Làm thế nào để làm mới một DataGrid WPF?

Trong cửa sổ khác, khi người dùng nhấp vào "Lưu", tôi tạo một hàng theo chương trình và thêm hàng bằng cách sử dụng "InsertOnSubmit". Sau đó tôi sử dụng phương thức "SubmitChanges" của DataContext.

Vấn đề của tôi là DataGrid không được cập nhật. Nếu tôi khởi động lại ứng dụng, tôi có thể thấy hàng mới, vì vậy nó nằm trong cơ sở dữ liệu, nhưng tôi không thể tìm thấy cách để làm mới DataGrid.

Cho đến nay tôi đã cố gắng sử dụng "UpdateTarget" trên BindingExpression của DataGrid, nhưng nó không giúp ích gì. Tôi cũng đã thử "dataGrid.Items.Refresh()" - cùng một kết quả. Làm thế nào tôi có thể sửa lỗi này?

Trả lời

20

Lý do không cập nhật là LINQ-to-SQL không triển khai INotifyCollectionChanged, vì vậy WPF không có cách nào để nói rằng ItemsSource đã được cập nhật. Cách đáng sợ nhất để sửa lỗi này là sao chép các kết quả LINQ-to-SQL của bạn vào một ObservableCollection - khi bạn thực hiện Chèn, cũng thêm vào bộ sưu tập quan sát được. Sau đó, bạn sẽ thấy bản cập nhật.

+0

Giải pháp của bạn rõ ràng là hoạt động. Tôi chỉ nghĩ rằng tôi có thể nhận được đi với đánh dấu ràng buộc XAML đơn giản. – KovBal

+0

Nếu chúng ta sử dụng ObservableCollection làm cầu nối giữa LINQ với sql và điều khiển, thì làm sao chúng ta có thể sử dụng SubmitChanges() để gửi kết quả trở lại cơ sở dữ liệu? – MemoryLeak

+3

@MemoryLeak - vì vậy đây là một mẹo nhỏ; không chỉ bạn muốn biết khi nào * bộ sưu tập * thay đổi (tức là những gì INotifyCollectionChanged), bạn cũng muốn biết khi nào có bất kỳ mục * nào thay đổi. Vì vậy, bạn cần phải đăng ký thay đổi bộ sưu tập, sau đó thêm/xóa, hãy đăng ký INOTifyPropertyChanged của mỗi mục. * Sau đó * bạn phải quyết định những gì cần lưu dựa trên thông báo nào bạn nhận được –

2

Vấn đề là bạn cần phải làm mới dữ liệu LINQ to SQL của bạn. DataContext sẽ không nhận ra đúng hàng mới ngay cả sau khi gửi thay đổi. Bạn cần phải xử lý DataContext mà bạn có và tạo một DataContext mới. Trong hầu hết các trường hợp, DataContext nên được sử dụng cho một hoạt động ngắn và không phải là một đối tượng đứng lâu.

+0

Giải pháp của bạn rất giống với Pwninstein. Thật không may là kết quả là như nhau, vì sự kiện DataContextChanged không làm cho việc làm mới DataGrid. – KovBal

0

Hoặc chỉ cần gọi lại mã tìm kiếm (thường là nút tìm kiếm)> Tôi đã giải quyết nó trong trường hợp của tôi như thế này.

1

Nếu bạn gặp trường hợp khi tải lại lưới trong cửa sổ khác, bạn có thể chỉ cần đóng cửa sổ đó và gọi lại.

56
+0

Cảm ơn bạn :) Tôi đã thử khôi phục cùng một nguồn nhưng nó không cập nhật dữ liệu.Thiết lập ItemsSource = null và sau đó các nguồn chính xác đã làm một bản cập nhật nhưng gây ra SelectionChanged được bắn. Các Items.Refresh() làm việc hoàn hảo! – Gertjan

+0

Công trình này hoàn hảo! –

+0

Hoạt động hoàn hảo. thanks :) –

4

Tôi chạy vào cùng một vấn đề và thấy rằng nơi tốt nhất cho ObservableCollection là DataContext. Nó có một số phương pháp một phần được tạo ra bởi nhà thiết kế có thể được sử dụng để cập nhật bộ sưu tập. Mã này hoạt động khá tốt:

partial class DataClassesDataContext 
{ 
    private ObservableCollection<Task> taskCollection; 
    public ReadOnlyObservableCollection<Task> TaskView { get; private set; } 

    partial void OnCreated() 
    { 
     taskCollection = new ObservableCollection<Task>(Tasks); 
     TaskView = new ReadOnlyObservableCollection<Task>(taskCollection); 
    } 

    partial void InsertTask(Task instance) 
    { 
     taskCollection.Add(instance); 
     this.ExecuteDynamicInsert(instance); 
    } 

    partial void DeleteTask(Task instance) 
    { 
     taskCollection.Remove(instance); 
     this.ExecuteDynamicDelete(instance); 
    } 
} 
0

Vì một lý do nào đó Items.Refresh() không hoạt động đối với tôi. Công việc gì đã làm cho bộ sưu tập cơ bản của tôi kế thừa ObservableCollection và sau đó gọi phương thức Add của nó.

((ContactUIObjects)dgrdContacts.ItemsSource).Add(new ContactUIObject(o)); 

ContactUIObjects chỉ là bộ sưu tập cơ bản của lưới.