7

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

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

我似乎找不到任何在集合更改时触发的事件,所以我想我需要以某种方式挂钩到 collectionchanged 通知?我不确定该怎么做。

基本上,当集合发生变化时,我想做除了 ListView 在更新列表中已经做的工作​​之外的额外工作。

4

3 回答 3

26

默认情况下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而不是这将休息。;)

PS 这应该在 xaml 代码隐藏中。

于 2011-04-27T15:15:05.227 回答
0

您将不得不将处理程序附加到您的列表中。或者,使用 aCollectionView并将更改的事件挂在那里。

在你的代码隐藏中,这样做:

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


private void SortCollectionChanged( object sender, NotifyCollectionChangedEventArgs e )
{
  Debug.WriteLine( "Changed" );
}
于 2011-04-27T15:01:48.203 回答
0

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;
于 2011-04-27T15:04:33.363 回答