WPF:如何钩取ListView的ItemsSource集合变更通知?

9

我有一个ListView,它是绑定到一个ObservableCollection的...

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

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

基本上,当集合更改时,我想要进行额外的工作,超出了ListView在更新其列表方面已经完成的工作。

3个回答

30

默认情况下,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代码后台。


这个完美地运行了,感谢关于类型转换的信息。 - michael

0

你需要将处理程序附加到列表上。或者,使用CollectionView并在那里挂钩更改事件。

在你的代码后台中,像这样操作:

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


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

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;

1
如果原帖作者希望逻辑在ViewModel上运行,那么这将起作用,但我猜他想在View上增加一些逻辑,因为他展示了一些XAML和绑定。不过我可能猜错了。 - myermian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接