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.

Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top