Cómo generar un evento cuando se cambia DataGrid.ItemsSource

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

preguntado el 22 de mayo de 12 a las 20:05

¿Has mirado el evento row_Created? -

3 Respuestas

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

¿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

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 or haz tu propia pregunta.