2010-10-11 18 views
9

Tôi đã gắn một ObservableCollection với một DataGrid. Khi tôi thay đổi giá trị trong DataGrid, sự kiện RowEditEnding được nâng lên. Nhưng e.Row.Item là đối tượng trước khi chỉnh sửa, vì vậy bạn không thấy các giá trị mới. Tôi hiểu rằng vì EditEnding. Trong Silverlight bạn có một sự kiện EditEnded, làm thế nào tôi có thể lấy đối tượng với các giá trị mới khi tôi chỉnh sửa DataGrid.WPF DataGrid có RowEditEnding nhưng không có RowEditEnded

cảm ơn,

Filip

Trả lời

6

Vâng, có lẽ điều này có thể giúp: http://wpf.codeplex.com/Thread/View.aspx?ThreadId=39356

http://blogs.msdn.com/b/vinsibal/archive/2009/04/14/5-more-random-gotchas-with-the-wpf-datagrid.aspx

Hoặc này, xem điểm số 5. ​​

Bạn sẽ phải tinker với nó để có được những gì bạn muốn tôi nghĩ, nhưng tôi hy vọng rằng sẽ giúp! Hoặc chỉ cho bạn một hướng tốt.

+4

Không thể tin rằng MS vẫn chưa triển khai sự kiện cơ bản như vậy. Lần đầu tiên nó dễ dàng hơn trong Silverlight so với trong WPF. :) Điểm liên kết thứ hai 5 là câu trả lời !!! Đã làm cho tôi. Nhiều Cảm ơn – Houman

0

Đính kèm sự kiện đã thay đổi của ObservableCollection.

Tôi đã liên kết với một DataTable và đã sử dụng sự kiện RowChanged.

+0

Không hoạt động khi thay đổi một thuộc tính của một mục trong bộ sưu tập. –

7

Từ http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c38fc695-d1ec-4252-87b7-feb484ee01e4/, thay đổi UpdateSourceTrigger của liên kết thành PropertyChanged. Thuộc tính sau đó sẽ được cập nhật ngay lập tức, trước sự kiện RowEditEnding và giá trị mới có thể được truy cập từ trình xử lý sự kiện RowEditEnding.

Ví dụ, đối với một DataGridComboBoxColumn

SelectedItemBinding="{Binding ForTestResult, UpdateSourceTrigger=PropertyChanged}" 

Điều này có vẻ là một cách rất đơn giản để giải quyết vấn đề này.

Ngoài ra, mặc dù tôi chưa thử nó, tôi nghĩ bạn cũng nên dễ dàng truy cập giá trị ban đầu trước khi chỉnh sửa nếu đối tượng của bạn triển khai IEditableObject.

+1

Cảm ơn, đây sẽ là câu trả lời! – orangesherbert

+0

Sẽ không hoạt động đối với các giá trị được định dạng ngày tháng, số thập phân, vv Chỉ dành cho chuỗi. –

+0

Tôi cũng nghĩ rằng đây phải là câu trả lời, vì vậy tôi đã bình chọn –

1

Giải pháp này có vẻ đơn giản. Được giới thiệu từ msdn forum.

private void dgEmployees_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) 
{   
    Action action = delegate 
        { 
        Employee emp = e.Row.Item as Employee; 
        //do something nice to the employee     
        }; 
    Dispatcher.BeginInvoke(action, System.Windows.Threading.DispatcherPriority.Background); 
} 
0

cách tươi và IMHO nhanh nhất của tôi là để thêm bool rowEdited=false, sau đó đặt nó vào bên trong trueDataGrid_RowEditEnding và đặt mã của bạn cho 'editEnded' bên DataGrid_LayoutUpdated:

if (rowEdited) 
{ 
    //main code here// 
    rowEdited=false; 
} 

.