WPF: Как я могу подключиться к ListSource CollectionChanged уведомлению ListView? - PullRequest
4 голосов
/ 27 апреля 2011

У меня есть ListView, который привязан к ObservableCollection ...

<ListView x:Name="List1" ItemsSource="{Binding MyList}" />

Кажется, я не могу найти ни одного события, которое запускается при изменении коллекции, поэтому я думаю, что каким-то образом мне нужно каким-то образом подключиться к уведомлению об изменении коллекции? Я не совсем уверен, как это сделать.

В основном, когда коллекция изменяется, я хочу выполнить дополнительную работу сверх того, что уже делает ListView при обновлении своего списка.

Ответы [ 3 ]

16 голосов
/ 27 апреля 2011

По умолчанию ItemsSource имеет тип IEnumerable. Сначала необходимо привести тип к типу, который имеет доступ к событию CollectionChanged, а затем добавить обработчик для этого события.

((INotifyCollectionChanged)List1.ItemsSource).CollectionChanged +=
    new NotifyCollectionChangedEventHandler(List1CollectionChanged);

public void List1CollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
{
    // Your logic here
}


Примечание: я приведу его к INotifyCollectionChanged в моем примере, но вы действительно можете привести его к любому объекту, который реализует это. Хотя в качестве лучшей практики вы должны приводить к наиболее универсальному типу, который дает вам доступ к необходимым методам / свойствам / событиям. Итак, в то время как вы можете привести его к ObservableCollection, вам не нужно. INotifyCollectionChanged содержит нужное вам событие, и если вы когда-нибудь решите использовать какой-либо другой тип коллекции, который его реализует, это продолжит работать, тогда как приведение к ObservableCollection означает, что если вы однажды решите, что ваш список теперь типа MyOwnTypeOfObservableCollectionNotDerivedFromObservableCollection, чем это сломается. ;)

P.S. Это должно идти в коде XAML.

0 голосов
/ 27 апреля 2011

ObservableCollection {T} предоставляет событие INotifyCollectionChanged.CollectionChanged . Когда привязывается к ItemsSource , механизм привязки данных обрабатывает распространение изменений из источника в элемент управления, но если вам нужно выполнить дополнительную обработку, вы можете присоединить обработчик к событию CollectionChanged и использовать NotifyCollectionChangedEventArgs это обеспечивает.

Предполагается, что в вашей модели представления есть публичное свойство с именем 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;
0 голосов
/ 27 апреля 2011

вам нужно прикрепить обработчик к вашему списку. Или используйте CollectionView и подключите туда измененное событие.

в вашем коде, сделайте так:

MyList.CollectionChanged += new NotifyCollectionChangedEventHandler( this.MyCollectionChanged );


private void SortCollectionChanged( object sender, NotifyCollectionChangedEventArgs e )
{
  Debug.WriteLine( "Changed" );
}
...