我有ListView
数据绑定到ObservableCollection
...
<ListView x:Name="List1" ItemsSource="{Binding MyList}" />
我似乎无法找到任何在集合发生变化时触发的事件,所以我想我不知何故需要以某种方式挂钩到collectionschanged通知中?我不确定该怎么做。
基本上,当集合发生变化时,我想要做更多的工作,而不是ListView在更新它的列表时所做的工作。
答案 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;