2012-05-22 29 views
25

Tôi mới trong WPF, và tôi đang làm việc với DataGrids và tôi cần phải biết khi thuộc tính ItemsSource được thay đổi.Làm thế nào để nâng cao một sự kiện khi DataGrid.ItemsSource được thay đổi

Ví dụ, tôi sẽ cần nó khi hướng dẫn này được thực thi một sự kiện có để nâng cao:

dataGrid.ItemsSource = table.DefaultView; 

Hoặc khi liên tiếp được bổ sung.

Tôi đã cố gắng sử dụng mã này:

CollectionView myCollectionView = (CollectionView)CollectionViewSource.GetDefaultView(myGrid.Items); 
((INotifyCollectionChanged)myCollectionView).CollectionChanged += new NotifyCollectionChangedEventHandler(DataGrid_CollectionChanged); 

Nhưng mã này chỉ hoạt động khi người dùng thêm một hàng mới cho bộ sưu tập. Vì vậy, tôi cần một sự kiện được nâng lên khi toàn bộ thuộc tính ItemsSource có bất kỳ thay đổi nào, hoặc vì toàn bộ bộ sưu tập được thay thế hoặc bởi vì một hàng đơn lẻ được thêm vào.

Tôi hy vọng bạn có thể giúp tôi. Cảm ơn bạn trước

+0

Bạn đã nhìn sự kiện row_Created? – Limey

Trả lời

52

ItemsSource là thuộc tính phụ thuộc, do đó, bạn có thể dễ dàng được thông báo khi thuộc tính được thay đổi thành nội dung khác. Bạn sẽ muốn sử dụng này, thêm vào mã mà bạn có, không thay vì:

Trong Window.Loaded (hoặc tương tự), bạn có thể đăng ký như sau:

var dpd = DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty, typeof(DataGrid)); 
if (dpd != null) 
{ 
    dpd.AddValueChanged(myGrid, ThisIsCalledWhenPropertyIsChanged); 
} 

Và có một điều khiển thay đổi:

private void ThisIsCalledWhenPropertyIsChanged(object sender, EventArgs e) 
{ 
} 

Bất cứ khi nào ItemsSource Thuộc tính được đặt, phương thức ThisIsCalledWhenPropertyIsChanged được gọi.

Bạn có thể sử dụng số này cho bất kỳ thuộc tính phụ thuộc nào bạn muốn được thông báo về các thay đổi.

+3

Rất đẹp! Chính xác những gì tôi đang tìm kiếm. –

+0

Cho phép tạo ra hành vi kiểm soát tốt đẹp, nếu kế thừa từ các điều khiển tiêu chuẩn! – BendEg

+0

Người đàn ông tuyệt vời. Đã lưu thời gian của tôi. :) – shanmugharaj

8

Đây có phải là trợ giúp nào không?

public class MyDataGrid : DataGrid 
{ 
    protected override void OnItemsSourceChanged(
            IEnumerable oldValue, IEnumerable newValue) 
    { 
     base.OnItemsSourceChanged(oldValue, newValue); 

     // do something here? 
    } 

    protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e) 
    { 
     base.OnItemsChanged(e); 

     switch (e.Action) 
     { 
      case NotifyCollectionChangedAction.Add: 
       break; 
      case NotifyCollectionChangedAction.Remove: 
       break; 
      case NotifyCollectionChangedAction.Replace: 
       break; 
      case NotifyCollectionChangedAction.Move: 
       break; 
      case NotifyCollectionChangedAction.Reset: 
       break; 
      default: 
       throw new ArgumentOutOfRangeException(); 
     } 
    } 
} 
-1

Nếu bạn wnat để phát hiện hàng mới được thêm vào có thể thử DataGrid của InitializingNewItem hoặc AddingNewItem tổ chức sự kiện.

InitializingNewItem sử dụng:

Datagrid auto add item with data of parent

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