首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可观测CollectionViewSource

可观测CollectionViewSource
EN

Stack Overflow用户
提问于 2013-07-29 08:11:50
回答 2查看 2.3K关注 0票数 4

我正在尝试设置一个从ListBox获取数据的CollectionViewSource。我想要发生的是,当我更新底层数据源时,ListBox也会更新。我的Xaml看起来像这样..。

代码语言:javascript
复制
<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的原因是根据基础对象中的属性对列表进行排序。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-29 08:19:38

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

CollectionViewSource是UI和实际集合之间的一个层,它对集合的显示方式提供了一些额外的控制(排序、过滤、分组等)。它只在基础数据支持通知的情况下(通过实现上面提到的接口)将通知传递给UI。

票数 6
EN

Stack Overflow用户

发布于 2013-07-29 08:39:13

我怀疑您正在使用List<T>而不是ObservableCollection<T>作为CollectionViewSourceunderlying source collection

如果底层集合实现了,ICollectionView将使您能够将集合与传播INotifyCollectionChanged事件一起传播。

此外,如果您想要refresh您的集合,当T类中的任何property change都必须手动调用集合的Refresh时,OR可以使用.Net4.5中引入的ICollectionViewLiveShaping

关于这两种方法,请参阅我的答案- Automatically Refresh ICollectionView

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17918993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档