可观察的CollectionViewSource

时间:2013-07-29 08:11:50

标签: c# .net wpf xaml data-binding

我正在尝试设置一个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的原因是根据基础对象中的属性为列表提供排序。

2 个答案:

答案 0 :(得分:6)

要查看对集合本身所做的更改(例如添加和删除项目),集合应该实现INotifyCollectionChangedObservableCollection是此接口的基本实现)。要查看对集合中的项目所做的更改(例如,修改特定项目的特定属性),您的项目对象应实现INotifyPropertyChanged

CollectionViewSource是UI和实际集合之间的一个层,它提供了对集合显示方式的一些额外控制(排序,过滤,分组等)。如果底层数据支持通知(通过实现上述接口),它只会将通知传递给UI。

答案 1 :(得分:1)

我怀疑您使用List<T>代替ObservableCollection<T> underlying source collection作为CollectionViewSource

ICollectionView将使您能够filter, sort, or group集合以及传播INotifyCollectionChanged事件(如果基础集合实现它)。

此外,如果你想refresh property change TRefresh课程,你需要手动调用你的收藏集ICollectionViewLiveShaping,或者可以使用{{1}}在 .Net4.5 中引入。

请参阅我在这里的答案 - Automatically Refresh ICollectionView