web-dev-qa-db-fra.com

Comment déclencher un événement lorsque DataGrid.ItemsSource est modifié

Je suis nouveau dans WPF, je travaille avec DataGrids et j'ai besoin de savoir quand la propriété ItemsSource est modifiée.

Par exemple, j'aurais besoin que lorsque cette instruction est exécutée, un événement doit déclencher:

dataGrid.ItemsSource = table.DefaultView;

Ou lorsqu'une ligne est ajoutée.

J'ai essayé d'utiliser ce code:

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

Mais ce code ne fonctionne que lorsque l'utilisateur ajoute une nouvelle ligne à la collection. Par conséquent, j'ai besoin d'un événement qui doit être déclenché lorsque la propriété ItemsSource entière a une modification, soit parce que la collection entière est remplacée, soit parce qu'une seule ligne est ajoutée.

J'espère que vous pouvez m'aider. Merci d'avance

29
Dante

ItemsSource est une propriété de dépendance, il est donc assez facile d'être averti lorsque la propriété est remplacée par autre chose. Vous voudriez l'utiliser en plus du code que vous avez, pas à la place de:

Dans Window.Loaded (ou similaire) vous pouvez vous abonner comme ceci:

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

Et avoir un gestionnaire de changement:

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

Chaque fois que la propriété ItemsSource est définie, la méthode ThisIsCalledWhenPropertyIsChanged est appelée.

Vous pouvez l'utiliser pour la propriété de dépendance any pour laquelle vous souhaitez être informé des modifications.

57
vcsjones

Est-ce une aide?

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();
        }
    }
}
11
Phil