Cómo generar un evento cuando se cambia DataGrid.ItemsSource
Frecuentes
Visto 34,293 veces
36
Soy nuevo en WPF, estoy trabajando con DataGrids y necesito saber cuándo se cambia la propiedad ItemsSource.
Por ejemplo, necesitaría que cuando se ejecute esta instrucción, un evento tenga que generar:
dataGrid.ItemsSource = table.DefaultView;
O cuando se agrega una fila.
He intentado usar este código:
CollectionView myCollectionView = (CollectionView)CollectionViewSource.GetDefaultView(myGrid.Items);
((INotifyCollectionChanged)myCollectionView).CollectionChanged += new NotifyCollectionChangedEventHandler(DataGrid_CollectionChanged);
Pero este código solo funciona cuando el usuario agrega una nueva fila a la colección. Por lo tanto, necesito un evento que se genere cuando toda la propiedad ItemsSource tenga algún cambio, ya sea porque se reemplaza toda la colección o porque se agrega una sola fila.
Espero que puedas ayudarme. Gracias de antemano
3 Respuestas
70
ItemsSource
es una propiedad de dependencia, por lo que es bastante fácil recibir una notificación cuando la propiedad cambia a otra. Le gustaría usar esto además del código que tiene, no en lugar de:
In Window.Loaded
(o similar) puedes suscribirte así:
var dpd = DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty, typeof(DataGrid));
if (dpd != null)
{
dpd.AddValueChanged(myGrid, ThisIsCalledWhenPropertyIsChanged);
}
Y tener un controlador de cambios:
private void ThisIsCalledWhenPropertyIsChanged(object sender, EventArgs e)
{
}
Siempre que el ItemsSource
La propiedad está establecida, el ThisIsCalledWhenPropertyIsChanged
método se llama.
Puedes usar esto para cualquier propiedad de dependencia de la que desea que se le notifiquen los cambios.
contestado el 22 de mayo de 12 a las 20:05
¡Muy agradable! Exactamente lo que estaba buscando. - Austin Wernli
¡Permite crear un buen comportamiento de control, si se hereda de los controles estándar! - BendEg
Una cosa a tener en cuenta es que este patrón crea una pérdida de memoria incorrecta si no se elimina explícitamente. El objeto fuente (myGrid
en esta respuesta) nunca se puede recolectar basura, ya que la estática DependencyPropertyDescriptor
tiene una fuerte referencia a él durante la vida útil de la aplicación. Ver esta pregunta para más detalles - andres hanlon
19
¿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();
}
}
}
contestado el 22 de mayo de 12 a las 20:05
-1
Si desea detectar una nueva fila agregada, puede probar DataGrid's InitializingNewItem
or AddingNewItem
Evento.
InitializingNewItem
uso
Elemento de agregación automática de Datagrid con datos de padre
contestado el 23 de mayo de 17 a las 13:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c# wpf events datagrid or haz tu propia pregunta.
¿Has mirado el evento row_Created? - Limey