我正在尝试设置一个从ListBox获取数据的CollectionViewSource。我想要发生的是,当我更新底层数据源时,ListBox也会更新。我的Xaml看起来像这样..。
<Window.Resources>
<ObjectDataProvider x:Key="AppTests" ObjectType="{x:Type Application:AppTestProvider}" MethodName="GetAppTests" />
<CollectionViewSource x:Key="cvs" Source="{StaticResource AppTests}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Priority" Direction="Ascending" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</Window.Resources>
<Grid>
<ListBox x:Name="TestList" ItemsSource="{Binding Source={StaticResource cvs}}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding TestName}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>这很好地显示了数据,但是如果我更改了底层数据,那么在调用后面代码中的cvs.View.Refresh()方法之前,这些更改不会出现在网格上。
我如何使这个“可观察的”,使变化自动发生?
注意:使用CVS的原因是根据基础对象中的属性对列表进行排序。
发布于 2013-07-29 08:19:38
要查看对集合本身所做的更改(例如添加和删除项),集合应该实现INotifyCollectionChanged (ObservableCollection是此接口的基本实现)。要查看对集合中的项所做的更改(例如修改特定项上的特定属性),您的item对象应该实现INotifyPropertyChanged。
CollectionViewSource是UI和实际集合之间的一个层,它对集合的显示方式提供了一些额外的控制(排序、过滤、分组等)。它只在基础数据支持通知的情况下(通过实现上面提到的接口)将通知传递给UI。
发布于 2013-07-29 08:39:13
我怀疑您正在使用List<T>而不是ObservableCollection<T>作为CollectionViewSource的underlying source collection。
如果底层集合实现了,ICollectionView将使您能够将集合与传播INotifyCollectionChanged事件一起传播。
此外,如果您想要refresh您的集合,当T类中的任何property change都必须手动调用集合的Refresh时,OR可以使用.Net4.5中引入的ICollectionViewLiveShaping。
关于这两种方法,请参阅我的答案- Automatically Refresh ICollectionView
https://stackoverflow.com/questions/17918993
复制相似问题