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