我有一个ListView
,它是绑定到一个ObservableCollection
的...
<ListView x:Name="List1" ItemsSource="{Binding MyList}" />
我似乎找不到任何在集合更改时触发的事件,所以我想我需要以某种方式钩入集合更改通知?但我不太确定该如何做。
基本上,当集合更改时,我想要进行额外的工作,超出了ListView在更新其列表方面已经完成的工作。
我有一个ListView
,它是绑定到一个ObservableCollection
的...
<ListView x:Name="List1" ItemsSource="{Binding MyList}" />
我似乎找不到任何在集合更改时触发的事件,所以我想我需要以某种方式钩入集合更改通知?但我不太确定该如何做。
基本上,当集合更改时,我想要进行额外的工作,超出了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
类型,那么它就会失效。 ;)
P.S. 这应该放在xaml代码后台。
你需要将处理程序附加到列表上。或者,使用CollectionView
并在那里挂钩更改事件。
在你的代码后台中,像这样操作:
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;