【发布时间】:2013-12-09 21:18:01
【问题描述】:
我有一个 (WPF) DataGrid,我在其中附加了一个 ICollectionView
XAML:
<DataGrid x:Name="TodoList" ItemsSource="{Binding TodoItemsCollection}" DataContext="{Binding}" />
构造函数(代码隐藏)
TodoItemsCollection = CollectionViewSource.GetDefaultView(Storage.TodoItems);
TodoItemsCollection.Filter = TodoItemsFilter;
(Storage.TodoItems 是一个 ObservableCollection)
TodoItemsCollection 属性
private ICollectionView _todoItemsCollection;
public ICollectionView TodoItemsCollection
{
get { return _todoItemsCollection; }
set
{
if (_todoItemsCollection != value)
{
_todoItemsCollection = value;
OnPropertyChanged("TodoItemsCollection");
}
}
}
Storage.TodoItems 是一个 ObservableCollection,跟踪器在其中添加、编辑和删除项目。
此更改应立即显示在 DataGrid 中。
但是,问题在于所有这些更改都没有反映在 DataGrid 中(即 DataGrid 没有更新)。
例如,如果我打电话给TodoItemsCollection.Refresh(),没有任何变化。
使用刷新按钮(仅用于测试目的),我将 DataGrid 的 ItemsSource 设置为 null 并将其重置 (TodoItemsCollection = CollectionViewSource.GetDefaultView(Storage.TodoItems);)。
此手动刷新显示新的/更改的/删除的项目。
但是,过滤不再起作用。
我阅读了大约三几十篇博客文章,但找不到解决问题的方法。
通常,调用Refresh() 或重置ItemsSource 对他们来说效果很好。
非常感谢任何建议!
【问题讨论】:
-
避免将绑定集合设置为空,而是使用 Clear()。至于你的问题,你可以试试 OnPropertyChanged(() => TodoItemsCollection);
-
对不起,我真的不明白你的意思。我将 TodoList.ItemsSource 设置为空。而且我不能在 TodoItemsCollection 上调用
Clear()。我该怎么办?谢谢! -
我不能在 OnPropertyChanged() 中使用 LambdaFunction。您如何建议 OnPropertyChanged() 方法应该是什么样子?谢谢。
-
对我来说,解决方案是在后面的代码中重新分配
ItemsSource。TodoList.ItemsSource = TodoItemsCollection;
标签: c# wpf datagrid observablecollection collectionviewsource