2012-05-22 17 views
25

Soy nuevo en WPF, y estoy trabajando con DataGrids y necesito saber cuándo se cambia la propiedad ItemsSource.Cómo generar un evento cuando se cambia DataGrid.ItemsSource

Por ejemplo, necesitaría que cuando se ejecuta esta instrucción tiene un evento para recaudar:

dataGrid.ItemsSource = table.DefaultView; 

O cuando se añade una fila.

He tratado de utilizar este código:

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

Pero este código sólo funciona cuando el usuario añade una nueva fila a la colección. Por lo tanto, necesito que se produzca un evento cuando toda la propiedad ItemsSource tiene algún cambio, ya sea porque se reemplaza toda la colección o porque se agrega una sola fila.

Espero que me puedan ayudar. Gracias de antemano

+0

¿Has mirado en caso row_Created? – Limey

Respuesta

52

ItemsSource es una propiedad de dependencia, por lo que es fácil recibir una notificación cuando la propiedad se cambia a otra cosa. Que se quiere utilizar este además del código que tiene, no en lugar de:

En Window.Loaded (o similar) se puede suscribir este modo:

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

Y tener un manejador de cambio:

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

Cuando se establece la propiedad ItemsSource, se llama al método ThisIsCalledWhenPropertyIsChanged.

Puede usar esto para cualquier propiedad de dependencia que desee que se le notifique sobre los cambios.

+3

¡Muy bien! Exactamente lo que estaba buscando. –

+0

¡Permite crear un comportamiento de control agradable, si se hereda de los controles estándar! – BendEg

+0

Excelente hombre. Ahorré mi tiempo. :) – shanmugharaj

8

¿Es esto alguna ayuda?

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(); 
     } 
    } 
} 
Cuestiones relacionadas