4

我正在尝试设置一个从 CollectionViewSource 获取数据的 ListBox。我想要发生的是,当我更新基础数据源时,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 的原因是根据基础对象中的属性为列表提供排序。

4

2 回答 2

6

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

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

于 2013-07-29T08:19:38.003 回答
1

我怀疑你正在使用List<T>而不是ObservableCollection<T>underlying source collectionCollectionViewSource.

ICollectionView如果底层集合实现了它,它将使您能够filter, sort, or group使用集合以及传播事件。INotifyCollectionChanged

此外,如果您想在课堂上refresh任何时候收集您的收藏,您必须手动调用您的收藏,或者可以使用.Net4.5中引入的。property changeTRefreshICollectionViewLiveShaping

对于这两种方法,请参阅我的答案 -自动刷新 ICollectionView

于 2013-07-29T08:39:13.503 回答