加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 可观察的CollectionViewSource

发布时间:2020-12-16 01:56:21 所属栏目:百科 来源:网络整理
导读:我正在尝试设置一个ListBox,从CollectionViewSource获取它的数据.我想要发生的是,当我更新底层数据源时,ListBox也会更新.我的Xaml看起来像这样…… Window.Resources ObjectDataProvider x:Key="AppTests" ObjectType="{x:Type Application:AppTestProvider}
我正在尝试设置一个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的原因是基于底层对象中的属性为列表提供排序.

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读