WPF: Comment puis-je brancher dans ItemsSource notification CollectionChanged d'un ListView?
-
24-10-2019 - |
Question
J'ai un ListView
qui DataBound à un ObservableCollection
...
<ListView x:Name="List1" ItemsSource="{Binding MyList}" />
Je ne peux pas sembler trouver un événement qui se déclenche lorsque la collection change, donc je pense que je dois en quelque sorte à accrocher dans la notification CollectionChanged en quelque sorte? Je ne suis pas sûr de savoir comment faire.
En fait, quand la collection change, je veux faire un travail supplémentaire au-delà de ce que le ListView fait déjà dans la mise à jour la liste de ce.
La solution
Par défaut, le ItemsSource
est de type IEnumerable
. Vous devez d'abord coulé à un type qui a accès à la CollectionChanged
événement, puis ajouter un gestionnaire pour cet événement.
((INotifyCollectionChanged)List1.ItemsSource).CollectionChanged +=
new NotifyCollectionChangedEventHandler(List1CollectionChanged);
public void List1CollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
{
// Your logic here
}
Note: je l'ai jeté à
INotifyCollectionChanged
mon exemple, mais vous pouvez vraiment jeter à tout objet qui implémente cela. Bien que, en tant que meilleure pratique, vous devriez jeter le type le plus générique qui vous donne accès aux méthodes / propriétés / événements dont vous avez besoin. Ainsi, alors que vous peut à jeter un ObservableCollection
, vous n'avez pas besoin. INotifyCollectionChanged
contient l'événement dont vous avez besoin et si vous décidez d'utiliser un autre type de collection qui met en œuvre, cela va continuer à travailler, alors que la coulée à un moyen de ObservableCollection
que si un jour vous décidez que vous liste est maintenant de type MyOwnTypeOfObservableCollectionNotDerivedFromObservableCollection
que cela va se rompre. ;)
P.S. Cela devrait aller dans le XAML code-behind.
Autres conseils
vous allez devoir joindre le gestionnaire à votre liste. Ou, utilisez un CollectionView
et accrochez le cas, il a changé.
dans votre codebehind, faites comme ceci:
MyList.CollectionChanged += new NotifyCollectionChangedEventHandler( this.MyCollectionChanged );
private void SortCollectionChanged( object sender, NotifyCollectionChangedEventArgs e )
{
Debug.WriteLine( "Changed" );
}
Un ObservableCollection {T} expose le INotifyCollectionChanged événement .CollectionChanged . Lorsque se lier à un ItemsSource la liaison de données poignées du moteur de la propagation de les changements de la source au contrôle d'éléments, mais si vous devez effectuer un traitement supplémentaire, vous pouvez joindre un gestionnaire à l'événement CollectionChanged et utiliser le NotifyCollectionChangedEventArgs il fournit.
En supposant que vous avez une propriété publique sur votre modèle de vue nommée MyList:
public ObservableCollection<T> MyList
{
get
{
if(_viewModelMyList == null)
{
_viewModelMyList = new ObservableCollection<T>;
_viewModelMyList.CollectionChanged += (o, e) =>
{
// code to process change event can go here
if(e.Action == NotifyCollectionChangedAction.Add)
{
}
};
}
return _viewModelMyList;
}
}
private ObservableCollection<T> _viewModelMyList;