WPF:如何挂钩ListView的ItemsSource CollectionChanged通知?

时间:2011-04-27 14:57:28

标签: wpf listview observablecollection itemssource inotifycollectionchanged

我有ListView数据绑定到ObservableCollection ...

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

我似乎无法找到任何在集合发生变化时触发的事件,所以我想我不知何故需要以某种方式挂钩到collectionschanged通知中?我不确定该怎么做。

基本上,当集合发生变化时,我想要做更多的工作,而不是ListView在更新它的列表时所做的工作。

3 个答案:

答案 0 :(得分:16)

默认情况下,ItemsSource的类型为IEnumerable。您需要首先转换为可以访问CollectionChanged事件的类型,然后为该事件添加处理程序。

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

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

<小时/> 注意:我在我的示例中将其强制转换为INotifyCollectionChanged,但您可以将其强制转换为任何实现它的对象。但是,作为最佳实践,您应该转换为最通用的类​​型,使您可以访问所需的方法/属性/事件。所以,当你可以将它投射到ObservableCollection时,你不需要。 INotifyCollectionChanged包含您需要的事件,如果您决定使用实现它的其他类型的集合,这将继续工作,而转换为ObservableCollection意味着如果您有一天决定您're list现在属于MyOwnTypeOfObservableCollectionNotDerivedFromObservableCollection类型,而不会破坏。 )

P.S。这应该在xaml代码隐藏中。

答案 1 :(得分:0)

您必须将处理程序附加到列表中。或者,使用CollectionView并在此处挂钩已更改的事件。

在您的代码隐藏中,请执行以下操作:

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


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

答案 2 :(得分:0)

ObservableCollection {T}公开INotifyCollectionChanged.CollectionChanged事件。当binding to an 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;