【发布时间】:2013-07-28 22:41:12
【问题描述】:
我正在尝试设置一个从 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 的原因是根据底层对象中的属性对列表进行排序。
【问题讨论】:
-
使用 ObservableCollection。
-
发布后我还读到 CollectionViewSource 没有观察到变化。这是正确的吗?这会影响我的工作吗?
-
不,这不是真的。
CollectionViewSource如果底层源集合实现它,则侦听 Collection 已更改。 -
@RohitVats,从某种意义上说,
CollectionViewSource自己不会观察到变化。它不会创建通知事件,而只是将它们转发到 UI 层。 -
@Nikita - 是的,这也是我在回答中写的 -
It propagate INotifyCollectionChanged events if the underlying collection implements it.
标签: c# .net wpf xaml data-binding