我有一个ListView
数据绑定到ObservableCollection
...
<ListView x:Name="List1" ItemsSource="{Binding MyList}" />
我似乎找不到任何在集合更改时触发的事件,所以我想我需要以某种方式挂钩到 collectionchanged 通知?我不确定该怎么做。
基本上,当集合发生变化时,我想做除了 ListView 在更新列表中已经做的工作之外的额外工作。
我有一个ListView
数据绑定到ObservableCollection
...
<ListView x:Name="List1" ItemsSource="{Binding MyList}" />
我似乎找不到任何在集合更改时触发的事件,所以我想我需要以某种方式挂钩到 collectionchanged 通知?我不确定该怎么做。
基本上,当集合发生变化时,我想做除了 ListView 在更新列表中已经做的工作之外的额外工作。
默认情况下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 代码隐藏中。
您将不得不将处理程序附加到您的列表中。或者,使用 aCollectionView
并将更改的事件挂在那里。
在你的代码隐藏中,这样做:
MyList.CollectionChanged += new NotifyCollectionChangedEventHandler( this.MyCollectionChanged );
private void SortCollectionChanged( object sender, NotifyCollectionChangedEventArgs e )
{
Debug.WriteLine( "Changed" );
}
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;