我正在尝试设置一个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的原因是根据基础对象中的属性为列表提供排序。
答案 0 :(得分:6)
要查看对集合本身所做的更改(例如添加和删除项目),集合应该实现INotifyCollectionChanged
(ObservableCollection
是此接口的基本实现)。要查看对集合中的项目所做的更改(例如,修改特定项目的特定属性),您的项目对象应实现INotifyPropertyChanged
。
CollectionViewSource是UI和实际集合之间的一个层,它提供了对集合显示方式的一些额外控制(排序,过滤,分组等)。如果底层数据支持通知(通过实现上述接口),它只会将通知传递给UI。
答案 1 :(得分:1)
我怀疑您使用List<T>
代替ObservableCollection<T>
underlying source collection
作为CollectionViewSource
。
ICollectionView
将使您能够filter, sort, or group
集合以及传播INotifyCollectionChanged
事件(如果基础集合实现它)。
此外,如果你想refresh
property change
T
个Refresh
课程,你需要手动调用你的收藏集ICollectionViewLiveShaping
,或者可以使用{{1}}在 .Net4.5 中引入。
请参阅我在这里的答案 - Automatically Refresh ICollectionView